/**
* 1、一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数。
* 2、派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型、返回类型必须与覆盖的基类函数完全一致,
* 特别的是,如果当返回类型是类本身的指针或引用时,覆盖效果依然成立。
* 3、如果虚函数使用了默认实参,则该实参值由本次调用的静态类型决定。
* 4、使用作用域运算符,回避虚函数的机制,强制调用虚函数的某个版本,形如“devied->Base::get();”。
* 5、编译器是根据指针或引用确定动态类型,非指针或非引用类型的普通对象都是确定的静态类型,没有多态效果。
* 6、派生类的成员或友元只能通过派生类对象来访问基类受保护的成员。
*/
#include <iostream>
class A {
public:
virtual A* get(int a = 1) {
std::cout << "A.get, a:" << a << std::endl;
return this;
}
};
class B : public A {
public:
B* get(int a = 2) override {
std::cout << "B.get, a:" << a << std::endl;
return this;
}
};
class C : public B {
public:
C* get(int a = 3) override {
std::cout << "C.get, a:" << a << std::endl;
return this;
}
};
int main() {
A* a = new C;
a->get();
getchar();
delete a;
// TODO
}