我们可以在派生类中调用"基类方法"。但是我们可以在基类函数中调用派生类方法吗?
#include<iostream.h>
class base {
public:
void print()
{
cout<<"base class";
}
};
class derived : public base
{
public:
void print()
{
cout<<"derived class";
}
};
如何在基类中调用这个派生类print()
函数?
不能从基类调用派生类中定义的普通方法。你所能做的是在基类中添加一个virtual
(可能是纯)方法,在派生类中提供实现。你可以从base.
class Base{
public:
virtual void foo(){cout<<"Hello";};
void bar() { foo();}
};
class Derived: public Base{
public:
void foo() override{ cout<<"Hi";}
};
int main() {
Base* b1 = new Derived();
b1->bar(); //will call Derived::foo()
Base* b2=new Base();
b2->bar(); // will call Base::foo()
}
可以在派生类对象的基类方法中调用派生类的方法,如果它是虚方法:
class base {
public:
void doSomething() {
print();
}
virtual void print() {
cout<<"base class";
}
};
class derived : public base {
public:
virtual void print() {
cout<<"derived class";
}
};
int main() {
derived d;
base* pb = &d;
pb->doSomething();
}
如果您确定base
的所有实例化将作为derived
的基类(可能是在使用好奇循环模板模式的情况下),您可以简单地将static_cast
this
到derived*
:
#include <iostream>
class base {
public:
void call_derived_print();
void print()
{
std::cout<<"base class";
}
};
class derived : public base
{
public:
void print()
{
std::cout<<"derived class";
}
};
void base::call_derived_print() {
//undefined behaviour unless the most-derived type of `*this`
//is `derived` or is a subtype of `derived`.
static_cast<derived*>(this)->print();
}