如何在私有继承中调用派生类方法
How to call derived class method in private inheritance?
下面的代码没有为我编译...
class Base
{
public:
Base(){}
virtual void Display()
{
cout << "Base Display" << endl;
}
};
class Derived : private Base
{
private:
void Display() override
{
cout << "Derived Display" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Derived d;
d.Display();
Derived* dp = new Derived();
dp->Display();
delete dp;
return 0;
}
编译器在我调用Derived::Display()
时报告错误。怎么称呼呢?通过编写这样的代码,我们可以解决什么样的问题?
不能从类外部访问私有方法。 因此编译错误。
您在这里混合了两个不同的概念,成员函数的访问说明符和基类的访问说明符。
不能调用成员函数,因为它的访问说明符private
,并且您正在尝试从不是友元的函数调用。这与Base
的继承类型无关,也与是否存在这种关系无关。
继承关系中的访问说明符确定代码的哪些部分可以将您的类型视为Base
,哪些部分不能。在这种特殊情况下,在Derived
及其朋友内部,您可以使用引用或指针指向Derived
,就好像它是 Base
,但不能在它之外。
私有继承模型是通过使用第三方库/类层次结构实现的,怎么称呼呢?通过编写这样的代码,我们可以解决什么样的问题?
并且可用于通过使用第三方库/类层次结构来提供某些功能,您自己的类型不需要从概念上派生。避免公共继承会阻止用户将你视为基础,这是有意为之,因为这是实现的细节。在您自己的类型中,可以使用继承关系:
void detail(Base *base) {
base->Display(); // Base::Display is public
}
void Derived::show() { // Derived::show is public:
detail(this); // Private inheritance is visible inside Derived
}
您已经在派生类中将Display
设为私有,因此可以通过指向Base,
的指针/引用访问它,但不能直接在Derived
对象中访问,也不能通过指向Derived
的引用/指针。
// This should work:
Base *b = new Derived;
b->Display();
// and so should this:
Derived d;
Base &b = d;
b.Display();
。但其中任何一个也需要公共继承,以允许从Derived
到Base
的隐式转换。
您不能调用具有私有继承的派生类方法,即使它被定义为公共,它也将成为私有的。
私有继承对外部世界隐藏了每个方法和属性,因此堆或堆栈上的Derived
实例无法像在主函数中那样直接调用 Display。可以将private
替换为 public
以避免此类错误,或者使用指向Base
的指针来访问隐藏的基方法。
编辑:根据杰里的建议进行了改进。
私有继承创建了一个"contains-a"关系(它实际上类似于创建类型为Base
的成员变量(。 您尝试做的是创建一个"is-a"关系,这是通过公共继承完成的。
- 为什么使用 "this" 指针调用派生成员函数?
- 调用派生类成员函数
- 从基类实例调用派生类方法而不进行强制转换
- 从基类 (C++) 调用派生类中的非虚函数
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何从 Gtk::窗口调用派生对象的析构函数
- 在dynamic_pointer_cast后调用派生类的构造函数
- 从 Base 引用对象调用派生类的成员
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 在 c++ 中,如何使用向量调用派生类?
- C++通过 const 引用传递时不调用派生类函数
- 哪个基类调用派生重写的方法?
- 如何从包含基类指针的容器中调用派生类函数(基于其类型)?
- 如何调用派生类之一
- 从基类数组调用派生函数
- 从具有泛型返回类型的 crtp 基类调用派生类中的函数
- 基类如何调用派生类在 c++ 中传递的闭包?
- 通过在基类中虚拟调用派生类中的函数来访问派生类中的函数
- 如何在另一个类的向量中调用派生类的析构函数
- 通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?