虚方法和构造函数?

时间:2012-09-08 21:42:12

标签: c++ constructor virtual

我有鸡蛋 - 鸡蛋问题 我想为容器类创建接口,这样我就可以强制执行特定的attr-accessors和其他方法,同时我希望能够从Containers构造函数中调用这些方法。
但是正如我们所知,从Constructor调用virtual方法将调用Base类方法,因为调用层次结构中的构造函数的顺序。
所以问题是我需要虚拟方法来强制实现,但这是我无法在构造函数中调用的东西 编辑:我想要当我必须实现Container类(C1,C2 ...)来强制实现特定的方法,然后我希望能够在Container-constructors中使用这些方法。简单来说,我想实现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;
}

正如我所问,是否有某种方法可以在特定构造函数()的后代类中强制实现。 类似“虚拟构造函数”的东西。

2 个答案:

答案 0 :(得分:5)

只需使构造函数变得微不足道,然后在构造函数返回后,调用某种初始化函数来完成对象的构造。您还可以使用clone惯用法,具体取决于您希望如何决定要构造的对象类型。

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

更新:你可以像这样包装:

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

现在你可以做到

 Wrapper foo(whatever);

您可以像foo一样使用Inner

答案 1 :(得分:3)

首先,您不应在构造或销毁期间调用虚函数。这根本不是一个好习惯。

摘自Effective C ++第3版的第9项:

  

这种看似违反直觉的行为是有充分理由的。因为基类构造函数在派生类构造函数之前执行,所以在基类构造函数运行时尚未初始化派生类数据成员。如果在基类构造期间调用的虚函数归结为派生类,派生类函数几乎肯定会引用本地数据成员,但这些数据成员尚未初始化。这将是未定义行为和深夜调试会话的直接票。调用尚未初始化的对象的某些部分本质上是危险的,因此C ++让你无法做到。

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