1

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

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

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

4

2 回答 2

5

只要让构造函数变得微不足道,然后在构造函数返回后,调用某种初始化函数来完成对象的构造。你也可以使用克隆习语,这取决于你想如何决定要构造什么样的对象。

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

更新:你可以这样包装:

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

现在你可以做

 Wrapper foo(whatever);

您可以foo像使用Inner.

于 2012-09-08T21:56:49.943 回答
3

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

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

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

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

于 2012-09-08T22:43:44.247 回答