gpt4 book ai didi

c++ - 实例化从 Base 私有(private)或 protected 继承的派生类

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:15 28 4
gpt4 key购买 nike

我有以下假设代码:

class Base {
public:
virtual void print() {
std::cout << "Base\n";
}
// assume virtual destructor
};

class Derived : private Base {
public:
void print() {
std::cout << "Derived\n";
}
};

int main() {
// Derived d{}; works fine
Base *pd = new Derived{}; // doesn't work
pd->print();
// assume memory is deallocated
}

起初,我认为它会起作用,因为无论如何构造函数都不会被继承。但是编译器报错:

error: 'Base' is an inaccessible base of 'Derived'

我无法弄清楚到底发生了什么?

最佳答案

这是一个很好的猜测,但问题不在于构造函数或成员函数。

行内

Base *pd = new Derived{}; // doesn't work

编译器正在隐式地将类型为 Derived* 的右侧 new Derived{} 转换为类型 Base* .

该标准用于描述何时可以将指向派生类的指针隐式转换为指向基类的指针的术语是可访问性。来自第 11.2/5 小节:

If a base class is accessible, one can implicitly convert a pointer to a derived class to a pointer to that base class

列出了一些可以使基类可访问的技术条件(11.2/4,如果你真的关心的话),但 Base 不满足这些条件。

简短的版本是,private 继承隐藏了基类,访问说明符 private 需要是 public 才能让您的代码编译。希望对您有所帮助。

关于c++ - 实例化从 Base 私有(private)或 protected 继承的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002553/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com