首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自构造函数的C++虚函数

来自构造函数的C++虚函数
EN

Stack Overflow用户
提问于 2009-01-30 17:37:04
回答 7查看 38.8K关注 0票数 59

为什么下面的示例打印"0“,必须进行哪些更改才能像我预期的那样打印"1”?

代码语言:javascript
复制
#include <iostream>
struct base {
   virtual const int value() const {
      return 0;
   }
   base() {
      std::cout << value() << std::endl;
   }
   virtual ~base() {}
};

struct derived : public base {
   virtual const int value() const {
      return 1;
   }
};

int main(void) {
   derived example;
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-01-30 17:41:03

因为base是先构造的,还没有“成熟”成derived。当它不能保证对象已经正确初始化时,它不能调用对象上的方法。

票数 95
EN

Stack Overflow用户

发布于 2009-01-30 17:43:23

在构造派生对象时,必须先完成基类构造函数,然后才能调用派生类构造函数的主体。在调用派生类构造函数之前,正在构造的对象的动态类型是基类实例,而不是派生类实例。因此,当从构造函数调用虚函数时,只能调用基类虚函数重写。

票数 20
EN

Stack Overflow用户

发布于 2009-01-31 08:07:11

实际上,有一种方法可以获得这种行为。“软件中的每个问题都可以通过一定程度的间接解决。”

代码语言:javascript
复制
/* Disclaimer: I haven't done C++ in many months now, there might be a few syntax errors here and there. */
class parent
{
public:
     parent( ) { /* nothing interesting here. */ };
protected:
     struct parent_virtual
     {
         virtual void do_something( ) { cout << "in parent."; }
     };

     parent( const parent_virtual& obj )
     {
          obj.do_something( );
     }
};

class child : public parent
{
protected:
     struct child_virtual : public parent_virtual
     {
         void do_something( ) { cout << "in child."; }
     };
public:
      child( ) : parent( child_virtual( ) ) { }
};
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/496440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档