虚函数多态(装箱调用)只能通过指针和引用实现
#include<iostream>
#include<windows.h>
using namespace std;
class A {
public:
A() { cout << "Constructing class A\n"; }
virtual void m() { cout << "invoking f from class A.\n"; }
};
class B : public A {
public:
B() { cout << "Constructing class B\n"; }
void m() { cout << "invoking f from class B.\n"; }
};
class C :public B {
public:
C() { cout << "Constructing class C\n"; }
void m() { cout << "invoking f from class C.\n"; }
};
class D :public C {
public:
D() { cout << "Constructing class D\n"; }
void m() { cout << "invoking f from class D.\n"; }
};
void p(A &a)
{
a.m();
}
int main()
{
D d;
p(d);
system("pause");
return 0;
}
例如这里的p(),函数,主函数把D的对象d作为参数传进p()中,在里面调用m()函数。因为m()为虚函数,所以结果如下:
2.
普通象是会创建基类对象的拷贝
子类那部分没了 所以子类的虚函数重写也没了
例如:
#include<iostream>
#include<windows.h>
using namespace std;
class A {
public:
A() { cout << "Constructing class A\n"; }
virtual void m() { cout << "invoking f from class A.\n"; }
};
class B : public A {
public:
B() { cout << "Constructing class B\n"; }
void m() { cout << "invoking f from class B.\n"; }
};
class C :public B {
public:
C() { cout << "Constructing class C\n"; }
void m() { cout << "invoking f from class C.\n"; }
};
class D :public C {
public:
D() { cout << "Constructing class D\n"; }
void m() { cout << "invoking f from class D.\n"; }
};
void p(A a)
{
a.m();
}
int main()
{
D d;
p(d);
system("pause");
return 0;
}
运行结果如下: