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