传递对象和传递指针(是否产生多态)

    xiaoxiao2022-07-14  165

    今天碰到一个例子,这样则是常见的多态行为,一个接口,多种实现。

    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);

    结果是

    最新回复(0)