【发布时间】:2021-04-30 21:22:00
【问题描述】:
我有一个类 A 和类 B,它们都有相同的方法和变量,但 B 有一个额外的变量(它完全独立于其他类成员)。 所以它会是这样的:
class A
{
void Foo();
bool m_var;
}
template< class T >
class B< T >
{
// Same stuff
void Foo();
bool m_var;
// Unique stuff
T m_data;
}
通常,我会使用继承B : public A,但我想让这些类保持超级紧凑,并且我不想在其中包含 vtable ptr(因为无论如何我都不会使用多态性)。实现这一目标的最佳方法是什么?我在考虑模板及其专业化 - 有 A<T> 和 A<void> 类,但我需要删除一些东西,而不是添加。我可以使用任何智能模板技巧吗?
我还在考虑创建具有所有常见功能的基类(没有虚拟 dtor)作为私有嵌套类和继承类 A< T > : public Base 和空 B : public Base 作为公共嵌套类。它不允许外部的任何人使用基类 ptr,但这听起来不像是最纯粹的解决方案......我的问题有什么“有效”的解决方案吗?
【问题讨论】:
-
继承 != 多态性。
-
Static Polymorphism 可能是?
-
B : public A本身并没有引入 vtable 指针。直到你真正添加了一个虚拟成员函数。 -
一个“vtable”是用于虚拟的。简单的继承并不意味着虚拟性。
-
只有当您计划通过指向父类的指针引用子类时才需要虚拟析构函数(即使用您试图避免的虚拟多态性)。如果您不打算这样做,那么非虚拟(或默认)析构函数是无害的。
标签: c++ templates inheritance