C++继承:先调用基类的虚方法,再调用派生方法
C++ Inheritance: Virtual methods of base is invoked first and then derived method is invoked
当通过基指针或指向派生的基引用调用虚方法时class object,首先调用基方法,然后调用派生方法。有人可以解释为什么要实现此行为而不是直接调用派生的 class 方法吗?
class Parent
class Parent{
private:
int money;
public:
void set_money(const int& m){
money = m;
}
virtual const int& get_money() const{
std::cout << "Parent version\n";
return money;
}
};
class Child
class Child : public Parent{
private:
int my_money;
mutable int family_money;
public:
void set_money(const int& m){
my_money = m;
}
const int& get_money() const{
family_money = my_money + Parent::get_money();
std::cout << "Child version\n";
return family_money;
}
void set_parent_money(const int& m){
Parent::set_money(m);
}
};
主要
int main(){
Child c;
c.set_parent_money(20);
c.set_money(50);
Parent *p = &c;
cout << "Pointer " << p->get_money() << endl;
Parent& pr = c;
cout << "Reference " << pr.get_money() << endl;
Parent po = c;
cout << "Object " << po.get_money() << endl;
return 0;
}
输出
Parent version
Child version
Pointer 70
Parent version
Child version
Reference 70
Parent version
Object 20
不,它以正确的顺序调用。唯一的问题是您首先从 Child
方法调用 Parent
方法,然后打印 Child
消息。如果您交换这两行,消息将按您预期的方式显示:
...
std::cout << "Child version\n";
family_money = my_money + Parent::get_money();
....
当通过基指针或指向派生的基引用调用虚方法时class object,首先调用基方法,然后调用派生方法。有人可以解释为什么要实现此行为而不是直接调用派生的 class 方法吗?
class Parent
class Parent{
private:
int money;
public:
void set_money(const int& m){
money = m;
}
virtual const int& get_money() const{
std::cout << "Parent version\n";
return money;
}
};
class Child
class Child : public Parent{
private:
int my_money;
mutable int family_money;
public:
void set_money(const int& m){
my_money = m;
}
const int& get_money() const{
family_money = my_money + Parent::get_money();
std::cout << "Child version\n";
return family_money;
}
void set_parent_money(const int& m){
Parent::set_money(m);
}
};
主要
int main(){
Child c;
c.set_parent_money(20);
c.set_money(50);
Parent *p = &c;
cout << "Pointer " << p->get_money() << endl;
Parent& pr = c;
cout << "Reference " << pr.get_money() << endl;
Parent po = c;
cout << "Object " << po.get_money() << endl;
return 0;
}
输出
Parent version
Child version
Pointer 70
Parent version
Child version
Reference 70
Parent version
Object 20
不,它以正确的顺序调用。唯一的问题是您首先从 Child
方法调用 Parent
方法,然后打印 Child
消息。如果您交换这两行,消息将按您预期的方式显示:
...
std::cout << "Child version\n";
family_money = my_money + Parent::get_money();
....