公共继承是否允许重写基类成员访问器
Does public inheritance allow to override the base classes member accessors?
我在一个代码示例中看到一些奇怪的东西。有一个基类和一个派生类。派生类从具有公共继承的基类派生而来。
class baseClass
{
public:
void foo();
}
class derivedClass : public baseClass
{
protected:
void foo();
}
派生类还覆盖了方法foo()
的访问器。foo()
为baseClass
中的public
, derivedClass
中的protected
。它可以构建和工作,但我不明白为什么有人会这样做,也不知道这在多大程度上是允许的。例如,protected缩小了访问范围,所以它是允许的,但是你不能用public?我不知道。
你写的东西有点棘手。代码的结果不会是您所期望的。如果你创建并使用derivedClass
实例你就不能调用foo()
,因为它是受保护的:
derivedClass object;
object.foo(); // Compilation error. Cannot access.
但是如果你创建一个指向derivedClass
类对象的指针并调用foo()
函数,它将调用baseClass
的foo()
而不是derivedClass
的foo()
,因为它不是基类中的虚函数。
baseClass* object = new derivedClass;
object->foo(); // This will call baseClass::foo();
隐藏函数时就是这种情况。如果将virtual
关键字添加到foo()
,则将调用derivedClass
的foo()
。
class baseClass
{
public:
virtual void foo();
}
class derivedClass : public baseClass
{
protected:
virtual void foo() override;
}
用法:
baseClass* object = new derivedClass;
object->foo(); // This will call derivedClass::foo();
虚函数可以被重写。这是虚函数的一个点。
但是,在您的示例中,derivedClass::foo()
隐藏了baseClass::foo()
。它不会覆盖它。
// your class definitions here
int main()
{
baseClass b;
derivedClass c;
baseClass *pb = &b;
baseClass *pc = &c;
b.foo(); // will call baseClass::foo()
pb->foo(); // will also call baseClass::foo()
pc->foo(); // will also call baseClass::foo() (not derivedClass::foo() which would be the case if baseClass::foo() was virtual)
c.foo(); // will attempt to call derivedClass::foo(), which the compiler will reject since it is protected
}
语句c.foo()
将编译如果derivedClass::foo()
是public
,并将调用derivedClass::foo()
。根据编译器和编译器的设置,编译器可能会发出baseClass::foo()
被隐藏的警告。
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 重写打印函数而不是覆盖基类
- 重写函数不打印基类数据
- 我无法重写基类的方法,因为我的派生类是模板化的
- C ++中有没有办法让派生类重写基类静态方法
- 重写基类中的编译器宏
- C++在基类本身中重写基类的抽象方法
- 重写基类返回类型
- 如何重写基类成员的类型
- 如何重写基类中的构造函数
- 使用虚拟重写基类方法不起作用
- 重写基类中的函数
- 派生类使用或不带 "virtual" 前缀重写基类的虚函数之间有什么区别?
- C++派生类用另一个派生类重写基类的成员
- 重写基类的成员变量的初始值
- 访问被重写基类函数内部的成员变量
- 你能重写基类中定义的私有函数吗
- 公共继承是否允许重写基类成员访问器
- 为什么静态方法重写基类非静态方法
- 如果派生类重写基类方法,为什么要调用基类方法