我有一个带有指针的基类,需要在所有子类的构造函数中进行特定的初始化。如何确保在子类的构造函数中初始化此变量?我基本上想要与制作纯虚函数相同的功能,除了指向对象的指针。有没有办法做到这一点?
我的代码看起来像这样:
A.hpp:
class A {
protected:
A();
X *pointer;
};
B.hpp:
class B : public A {
public:
B();
};
B.cpp:
B::B() : A() {
// how do i make sure pointer gets initialized here?
}
有没有办法实现这个目标?
答案 0 :(得分:11)
更改基类的构造函数:
class A {
protected:
explicit A(X* pointer);
X *pointer;
};
所以孩子必须给予价值,如:
class B : public A {
public:
B() : A(nullptr) {}
explicit B(X* x) : A(x) {}
};
答案 1 :(得分:5)
只需为基类构造函数定义参数:
class A {
protected:
A(X* ptr) : pointer(ptr) {}
X *pointer;
};
然后派生类需要在 ctor-initializer 列表中传递它们:
B::B() : A(/* value of pointer must be passed here*/)
{
}
答案 2 :(得分:3)
我将所有数据成员private
设为protected
仍然意味着您将无法更改界面。使数据成员private
也暗示如何确保它是由派生类提供的:给基类一个构造函数,它需要传入合适的指针。如果你想确保派生最多的class传入指针,使基类成为virtual
base:
class A {
X* pointer;
public:
A(X* p): pointer(p) {}
};
class B
: public A {
public:
B(): A(new X) {}
};
答案 3 :(得分:1)
不幸的是,当前的虚拟表不能(可移植地)直接包含“虚拟数据”,即类级通用的元数据。
您可以让虚方法返回指向某些X
...
你也可以使用typeinfo,即typeid
(在C ++ 11中)。例如,您可以定义静态哈希表
static std::unordered_map<std::typeinfo,X*> map;
X* getX() { return map[typeid(this)]; };
然后由您来适当填写map
。
答案 4 :(得分:1)
如果基类通过使用带有包含初始化值的参数的构造函数来初始化该变量就足够了。
class A {
protected:
A( X * thePointer );
X *pointer;
};
在这种情况下,任何派生类都必须显式调用基类构造函数并指定所需的值。
B::B() : A( thePointer ) {
// how do i make sure pointer gets initialized here?
}