当前位置:  开发笔记 > 编程语言 > 正文

构造函数的C++虚函数

如何解决《构造函数的C++虚函数》经验,为你挑选了3个好方法。

为什么以下示例打印"0"以及必须更改它以打印"1",如我所料?

#include 
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;
}

Sean Bright.. 90

因为base是先建造而且还没有"成熟" derived.当它无法保证对象已经正确初始化时,它无法调用对象上的方法.



1> Sean Bright..:

因为base是先建造而且还没有"成熟" derived.当它无法保证对象已经正确初始化时,它无法调用对象上的方法.


另一种看待它的方法是,在'base'的构造函数中,虚拟指针指向'blase'类的虚拟表,并且在完成'base'的构造之前它并不指向'derived'.它进入'derived'的构造函数

2> CB Bailey..:

在构造派生对象时,在调用派生类构造函数的主体之前,必须完成基类构造函数.在调用派生类构造函数之前,构造中的对象的动态类型是基类实例而不是派生类实例.因此,从构造函数调用虚函数时,只能调用基类虚函数覆盖.



3> Tanveer Bada..:

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

/* 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( ) ) { }
};

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有