有没有办法在C++基类中创建一个"virtual"变量?
Is there a way to make a "virtual" variable in a C++ base class?
我有一个带有指针的基类,需要在所有子类的构造函数中专门初始化。如何确保此变量在子类的构造函数中初始化?我本质上想要与制作纯虚函数相同的功能,除了指向对象的指针。有没有办法做到这一点?
我的代码看起来像这样:
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?
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '