C++:覆盖公共(public)\私有(private)继承

标签 c++ inheritance private public

如果 B 使用 publicA 继承,可以 B 覆盖其中一个函数并强制它私密吗?

class A
{
public:
    virtual double my_func1(int i);
    virtual double my_func2(int i);
}

class B : public A // Notice the public inheritance
{
public:
    virtual double my_func1(int i);
private:
    virtual double my_func2(int i);
}

反过来呢?如果继承类型是私有(private)的 - B 可以强制一个特定的函数是公共(public)的吗?

如果 A 是纯抽象的怎么办?有区别吗?

protected 在任何组合中都会有什么不同吗?

最佳答案

如果 B 使用 public 从 A 继承,B 是否可以覆盖其中一个函数并强制它为私有(private)? 没有

尽管 my_func1() 是在 privte 访问说明符下声明的,它仍然可以通过指向 class A 的指针调用,实际上指向class B 的对象

my_func1() 的调用在运行时根据指针指向的对象类型进行评估。在编译时,编译将 my_func1() 调用视为对 A::my_func1() 的调用,并且由于 A::my_func1() 是public 编译器不会只报告错误。只有在运行时才会评估实际的函数调用 B::my_func1()

当然,您不能通过 class B 的对象直接调用 my_func1(),因为 B::my_func1() 是在 Private 下声明的访问说明符并且您不能从类外部访问私有(private)声明的成员。

反过来呢?如果继承类型是私有(private)的 - B 可以强制一个特定的函数公开吗?
没有

如果您通过基类 class A 的指针调用 my_func1(),则在编译时它只是被评估为对 A::my_func1 的调用() 这是 Invalid 因为 A::my_func1() 在class A`

中被声明为私有(private)

如果 A 是纯抽象的呢?有区别吗?
没有
基类是抽象的还是多态的都没有区别。将适用相同的规则。

在任何组合中 protected 会产生什么不同吗?
没有
正如前 2 个 Q 中所解释的,如果您正在调用一个完全指向基类的虚函数,那么在编译时编译器只检查基类中该成员函数的访问,因为编译器将其视为对基类成员函数的调用。对函数的实际调用在 runtime 进行评估,该功能称为 Runtime PolymorphismDynamic polymorphism 独立于访问说明符,作为编译时构造。

总之,

覆盖基类的成员不会影响访问

关于C++:覆盖公共(public)\私有(private)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753833/

相关文章:

c++ - CMakeLists.txt :10 (find_package) in C++ 处的 Torch CMake 错误

c++ - 我构造子类对象的方式有什么问题?

c++ - 不可能从这个对象继承?

C++ 私有(private)真的是私有(private)的吗?

c++ - 在 OpenCV 中找不到 FREAK 检测器

c++ - 调用可变参数宏的可变参数函数

java - 在 Java 中重写 toString() 时遇到问题

c++ - 在 vector 中调用对象的成员函数

ios - iOS SDK 中的 Youtube 集成

c++ - 单元测试 Boost 文件系统 create_directories