不允许从 C++ 中的某个类继承 [关闭]
Posted
技术标签:
【中文标题】不允许从 C++ 中的某个类继承 [关闭]【英文标题】:Not allowing to inherit from some class in C++ [closed] 【发布时间】:2019-07-04 21:51:19 【问题描述】:我在C++
中遇到了以下程序:
template <class T>
class Foo
Foo() ;
friend T;
;
class Bar : public virtual Foo<Bar>
void doPrivateStuff();
public:
template<typename T>
void baz(T a) cout << a << endl;
;
它说使用这种方式不可能从Bar
继承。我有两个问题:
Bar
继承?
我可以虚拟继承吗?
我知道friend
是用来声明可以访问类的私有字段和方法的方法或者类,但是friend T
是什么意思呢?
它基于以下页面:
【问题讨论】:
你能告诉我们编译器的信息吗? I can inherit fromBar
just fine
@AndyG -- 现在尝试在main()
中实例化“Baz baz;
”,看看会发生什么。
@AndyG 尝试声明一个构造函数。我猜是因为bar
是一个模板类,在使用之前它不会初始化它,这就是你的示例编译的原因。
【参考方案1】:
虚拟继承的类总是成为最派生类的直接超类。换句话说,任何从Bar
继承的东西都将直接从Foo<Bar>
继承。这就是虚拟继承的含义。
但是,Foo<Bar>
有一个私有构造函数,并且只有Bar
是类的friend
,因此只有Bar
可以从Foo<Bar>
继承。
这有效地阻止了声明Baz
的子类,因为该子类必须虚拟继承模板类,但它不能构造它,因为继承的构造函数是私有的。
【讨论】:
谢谢。是否可以添加如何通过 C++ 模板专业化功能传递它? 虚拟基类不会自动成为最派生类的直接基类。最派生的类将构造它,但除此之外,它在类层次结构中仍有其正常位置。struct B int i; ; struct C : virtual B int i; ; struct D : C ; D d; d.i = 3;
该赋值分配给C
基址中的i
,而不是B
基址中的那个。虚拟继承意味着 多个 相同类型的虚拟基合并为一个子对象,该子对象由具有该虚拟基的所有基子对象共享。以上是关于不允许从 C++ 中的某个类继承 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章