今天碰到一个例子,这样则是常见的多态行为,一个接口,多种实现。
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);
结果是
: