今天碰到一个例子,这样则是常见的多态行为,一个接口,多种实现。
class A { public: virtual void fun() { cout << "1" << endl; } }; class B:public A { public: virtual void fun() { cout << "子类" << endl; } }; static void change(A *a) { a->fun(); } int main() { A *a=new A; B *b=new B; change(a); change(b); }结果自然是
将代码改成引用则是(底层一样)
class A { public: virtual void fun() { cout << "1" << endl; } }; class B:public A { public: virtual void fun() { cout << "子类" << endl; } }; static void change(A &a) { a.fun(); } int main() { //A *a=new A; //B *b=new B; A a; B b; change(a); change(b); }答案同上,依然是多态行为,引用(指针)去寻找虚函数表。
但是如果改成对象参数,则只是普通对象实例化函数调用,实则是父类和子类的兼容性质问题。
//但是如果改成对象参数,则只是普通对象实例化函数调用 class A { public: virtual void fun() { cout << "1" << endl; } }; class B:public A { public: virtual void fun() { cout << "子类" << endl; } }; static void change(A a) { a.fun(); } int main() { //A *a=new A; //B *b=new B; A a; B b; change(a); change(b);结果是
:
