为什么派生对象不只调用派生类中的重定义函数?
Why wouldn't a derived object just call a redefined function in the derived class?
考虑一下这种情况:Class BaseClass定义了函数x()和y()。x()调用y()。
类DerivedClass继承自BaseClass并重新定义函数y()。
创建DerivedClass类的对象D,并调用函数x()。
当调用x()时,使用的是BaseClass中定义的y()还是DerivedClass中重新定义的y?
对象D调用BaseClass中的函数X()
函数X()调用BaseClass中的函数Y(),而不是DerivedClass 中的函数Y()
函数调用在编译时绑定
这是静态绑定。
我不清楚为什么这是个问题。如果函数X是(由对象D)调用的,而对象D是派生类的,它不是只调用重新定义类的D.Y()吗?
这是给我的样品,我正在努力让它变得有意义。
baseClass
void x(); // calls y();
void y();
derivedClass
void y();
main()
derivedClass D;
D.x();
我的C++有些生疏,但我还是试一试:
您的代码应该是以下
class BaseClass
{
public:
void x() {
this->y();
}
protected:
void y() {
/* do stuff */
}
};
class DerivedClass : public BaseClass
{
protected:
void y() {
/* do different stuff */
}
};
int main() {
DerivedClass d;
d.x();
}
如果y
在其在BaseClass
中的定义中是虚拟的,则它是在执行d.x()
时调用的覆盖方法DerivedClass::y
(其中d
是DerivedClass
实例)。
为了使y
虚拟化,请使用virtual
关键字,如:
virtual void y() { /* do stuff */ }
如果y
不是使用BaseClass
中的virtual
关键字定义的,则x
调用的是BaseClass::y
。
为了从派生类的实例调用被重写的基类虚拟方法,必须使用完全限定的方法名:d.BaseClass::y()
,在您的情况下,如果不重写DerivedClass
中的x
,这肯定是不可能的。
我完全理解你的问题了吗?
如果对象的静态类型为(引用)D,则将调用D::y
。如果它具有BaseClass的静态类型(引用),则将调用BaseClass:y
。就这么简单。
相关文章:
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 有没有办法将C++结构/类中的所有定义都纳入范围而不从中派生?
- 如何使虚函数接受仅在派生类中定义的数据类型?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 错误:基类在从基类父派生类 Son 时未定义
- 自定义派生的 std::exception 类的 'what' 函数返回神秘的废话
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 从一个函数和某些类型指定符定义整个派生类的宏
- 具有数据类型的C 抽象基础将在派生类中定义
- 如何在C 中创建Logic_error的自定义派生类
- 从派生类重新定义基类中定义的结构
- 为什么派生类的这个定义是非法的
- 在编译时间定义多个派生类
- unique_ptr看不到派生类的自定义构造函数
- 类型特征检查 CRTP 派生,在基类中,问题是未定义的类型