c++多重继承的子类,其父类如果含有虚函数,那么子类如何去调用自身的非虚成员函数
时间: 2023-10-09 08:14:59 浏览: 164
子类可以通过作用域限定符来调用自身的非虚成员函数。其语法为:`子类名::函数名()`。
例如,假设有两个父类 A 和 B,均含有虚函数 func(),并且子类 C 继承了 A 和 B。子类 C 还定义了一个非虚成员函数 non_virt_func()。如果想要在子类 C 中调用 non_virt_func(),可以使用如下语法:
```
class C : public A, public B {
public:
void non_virt_func() {
// 子类自身的非虚成员函数
}
};
int main() {
C c;
c.non_virt_func(); // 调用子类自身的非虚成员函数
c.A::func(); // 调用父类 A 的虚函数
c.B::func(); // 调用父类 B 的虚函数
return 0;
}
```
在子类 C 中,可以直接调用 non_virt_func() 函数。如果需要调用父类 A 或 B 的虚函数 func(),则可以使用作用域限定符指定父类的名称。
相关问题
C++ 子类的子类重写其虚函数
在C++中,子类可以继续重写其父类的虚函数。当一个基类声明了一个虚函数,那么它的所有派生类都会自动获得这个虚函数的重写能力。如果一个子类再继承另一个基类,并且那个基类也包含一个同名的虚函数,那么这个新继承来的子类可以在自己的内部再次重写该函数,这就是所谓的“深层次的重写”。
这种机制使得每个具体的子类都可以提供他们自己的版本实现,即使是在它们的祖先类链上。当你通过基类指针或引用调用这个虚函数时,会根据实际的对象类型而不是指针的类型去调用相应的函数,这就是动态绑定或称为晚绑定。
举个例子:
```cpp
class Base {
public:
virtual void virtualFunction() { cout << "Base::virtualFunction()" << endl; }
};
class Derived1 : public Base {
public:
void virtualFunction() override { cout << "Derived1::virtualFunction()" << endl; }
};
class Derived2 : public Derived1 {
public:
// 再次重写 Base 中的虚函数
void virtualFunction() override { cout << "Derived2::virtualFunction()" << endl; }
};
int main() {
Base* basePtr = new Derived2(); // 看起来是 Base 指针,但实际上是 Derived2 对象
basePtr->virtualFunction(); // 输出 "Derived2::virtualFunction()"
delete basePtr;
return 0;
}
```
C++父类析构中调用的虚函数,子类重写虚函数,最后调用的是谁的虚函数
在C++中,当一个类中定义了虚函数,如果该类有子类继承它并且重写了该虚函数,那么在使用子类对象时,调用该虚函数会优先调用子类重写的虚函数。
对于析构函数,如果父类中定义了虚析构函数,那么在使用子类对象时,会先调用子类的析构函数,然后再调用父类的析构函数。如果子类没有定义析构函数,那么会直接调用父类的析构函数。
因此,在父类析构函数中调用虚函数时,如果子类重写了该虚函数,最后调用的就是子类重写的虚函数。
阅读全文