虚拟方法和构造函数

virtual methods and constructors?

本文关键字:构造函数 方法 虚拟      更新时间:2023-10-16

我有鸡肉<->鸡蛋问题
我想为容器类创建接口,这样我就可以强制实现特定的attr访问器和其他方法,同时我希望能够从Containers构造函数中调用这些方法
但正如我们所知,从构造函数调用虚拟方法将调用基类方法,因为层次结构中的构造函数是按顺序调用的
所以问题是我需要虚拟方法来强制实现,但这是我在构造函数中不能调用的
编辑:当我必须实现Container类(C1,C2…)时,我希望强制实现特定的方法,其次,我希望能够在Container构造函数中使用这些方法。简单地说,我想实现INTERFACE需求,只声明mixin。谢谢
你是如何解决这个问题的
下面是代码示例

#include <iostream>
using namespace std;
class Base {
public: 
    virtual void myvirt() { cout << "Base::virt()" << endl; };
};
class C1 : public Base {
 public:
    C1() {cout << "C1()" << endl; C1::myvirt(); };
    C1(int i) { cout << "C1(int)" << endl; }
    void myvirt() { cout << "C1::virt" << endl;}
};

class C2 : public Base {
 public:
    C2() {cout << "C2()" << endl; C2::myvirt();};
    C2(int i) { cout << "C2(int)" << endl; }
    void myvirt() { cout << "C2::virt" << endl;}
};
template<class C = C1>
class Sc: public C {
 public:
    Sc() : C() { cout << "Sc()" << endl; };
    Sc(int n): C(n)  { cout << "Sc(int)" << endl; };
};

int main() {
    Sc<C2>  $sx(12);
    return 0;
}

正如我所问的,是否有某种方法可以强制实现特定Constructor()的子类。类似于"虚拟建设者"。

只需使构造函数变得琐碎,然后在构造函数返回后,调用某种初始化函数来完成对象的构造。您也可以使用克隆习惯用法,这取决于您希望如何决定构建哪种类型的对象。

也可以有一个包装类,其构造函数首先构造内部类,然后调用其虚拟初始化函数。

更新:你可以这样包装:

 Class Wrapper : public Inner
 {
        public:
        Wrapper(...) : Inner(...)
        {
            init();
        }
        virtual ~Wrapper();
 }

现在你只需要做

 Wrapper foo(whatever);

您可以像使用Inner一样使用foo

在构建或销毁过程中,首先不应该调用虚拟函数。这根本不是一个好的做法。

摘自有效C++第3版第9项

这种看似违反直觉的行为是有充分理由的。由于基类构造函数在派生类构造函数之前执行,因此在基类构造函数运行时,派生类数据成员尚未初始化。如果在基类构造期间调用的虚拟函数下到派生类,则派生类函数几乎肯定会引用本地数据成员,但这些数据成员尚未初始化。对于未定义的行为和深夜调试会话来说,这将是一张不间断的罚单。调用对象中尚未初始化的部分本质上是危险的,所以C++没有办法做到这一点

http://www.artima.com/cppsource/nevercall.html