覆盖私人功能
Overriding private functions
我正在从一个从类派生(称为B类(的类(称为D类(上工作,并将由另一个类(称为E类(继承。我希望E类实例能够访问其父母的所有公共功能,但我特别想防止E类覆盖父级中的任何虚拟功能。
我认为,通过在D类的私有部分中覆盖功能,它将阻止派生的类覆盖,但事实并非如此。这会在E类中编译并运行该功能:
#include <iostream>
//an abstract base class
class b
{
public:
virtual ~b() = default;
protected:
virtual void print() = 0;
virtual void print_two()
{
std::cout << "base class" << std::endl;
}
};
class d: public b
{
public:
virtual ~d() = default;
private:
void print() override // note this is not virtual -adding final here does the trick
{
std::cout << "class d" << std::endl;
}
using b::print_two; //this doesn't work either
};
class e : public d
{
public:
void print() override //why is this possible given the function it's overriding is private and non-virtual?
{
std::cout << "class e" << std::endl;
}
void print_two() override //why is this possible given the function it's overriding is private and non-virtual?
{
std::cout << "print two class e" << std::endl;
}
};
int main()
{
e foo;
foo.print();
foo.print_two();
}
因此,有两个问题:为什么我可以覆盖祖父母中虚拟但不是父母虚拟的函数?为什么我可以覆盖在父母中受到祖父母但私人保护的功能?
我在G 和Clang中尝试了它,它没有错误或警告(-wall -wextra -wpedantic(
为什么我可以覆盖祖父母中虚拟但在父母中虚拟的函数?
没有这样的东西。一旦声明了虚拟函数,在所有派生类中,它都是隐式虚拟的。接近"非虚拟化"成员函数的唯一方法是声明其final
。这将使不可能进一步覆盖它,但是当通过祖先参考/指针调用时,它仍然会受到动态调度。但是,通过宣布其final
或其死者的孩子的任何访问,都可以在静态上解决。
为什么我可以覆盖在祖父母中受到保护但在父母中私有保护的功能?
访问说明符不会影响名称的可见性。它们仅影响可以使用该名称的位置。定义相同的功能将覆盖父母的实现,并通过动态调度调用。同样,因为这不是属于"访问"名称的领域。
如果孩子在父母中是私有的,则孩子不能参考父母的实现(Parent::foo
(,也不能外出消耗接口的代码。它仅以受控方式确保函数被调用。对于测试前后条件非常有用。
相关文章:
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 矢量被push_back功能覆盖
- 为什么我无法覆盖虚拟功能?
- 是否可以在 C++03 中实现类似"覆盖"的功能
- 覆盖私有功能,它与受保护功能有何不同?
- 带有抽象类的覆盖模板功能
- 覆盖私人功能
- C++继承 - 覆盖功能,包括使用 "::" s、.h 文件和.cpp文件
- C++向下转换以撤消功能覆盖
- 每个实例C 的覆盖功能
- SVML的覆盖功能调用
- 如何在标题文件中获取成员功能的正确代码覆盖范围
- C 从同一基本模板类覆盖功能,具有多个继承模棱两可的函数调用
- 是否有可能覆盖全局实现的功能
- variadic模板和功能覆盖
- 需要有关多个继承和可选功能覆盖C 的建议
- 我想我将名称隐藏与功能覆盖混淆了
- 虚拟功能覆盖和隐藏
- 纯虚拟功能覆盖
- 将私有功能覆盖给公共功能的潜在危险是什么?