山东城建建设职业学院教务网站,抚州免费注册公司,网站头页,wordpress 文章连续一. 静态多态
1. 何为静态多态#xff1f;
又称编译期多态#xff0c;即在系统编译期间就可以确定程序将要执行哪个函数。例如#xff1a;函数重载#xff0c;通过类成员运算符指定的运算。
2. 示例代码
函数重载示例#xff1a;
class A {
public:A() {}A( int x ) …一. 静态多态
1. 何为静态多态
又称编译期多态即在系统编译期间就可以确定程序将要执行哪个函数。例如函数重载通过类成员运算符指定的运算。
2. 示例代码
函数重载示例
class A {
public:A() {}A( int x ) {}void f() {}void f( int x ) {}
};class B {
public:B() {}void f() {}void f( int x ) {}
};
以上类A中两个A()是函数重载两个f()是函数重载类B同理。
二. 动态多态
1. 何为动态多态
动态多态是利用虚函数实现运行时的多态即在系统编译的时候并不知道程序将要调用哪一个函数只有在运行到这里的时候才能确定接下来会跳转到哪一个函数。 动态多态是在虚函数的基础上实现的而实现的条件有 (1) 在类中声明为虚函数 (2) 函数的函数名返回值函数参数个数参数类型全都与基类的所声明的虚函数相同否则是函数重载的条件 (3) 将子类对象的指针或以引用形式赋值给父类对象的指针或引用再用该指向父类对象的指针或引用调用虚函数 如此便可以实现动态多态程序会按照实际对象类型来选择要实行的函数具体时哪一个。
2. 示例代码
(1) 非多态
#include iostream
using namespace std;class A {
public:A() {}void f() { cout A::f() is called.\n; }
};class B : public A {
public:B() {}void f() { cout B::f() is called.\n; }
};int main() {A a;B b;A *p1 a;A *p2 b;p1-f();p2-f();return 0;
}
运行结果
A::f() is called.
A::f() is called.在这种情况下我们会发现程序的输出结果并不是我们想要的而是两次调用的f()函数都是基类的。这是因为使用的是基类指针而且基类中没有将f()声明为虚函数所以每次调用都会使用基类的方法。
(2)多态
#include iostream
using namespace std;class A {
public:A() {}virtual void f() { cout A::f() is called.\n; }
};class B : public A {
public:B() {}virtual void f() { cout B::f() is called.\n; }
};int main() {A a;B b;A *p1 a;A *p2 b;p1-f();p2-f();return 0;
}
运行结果
A::f() is called.
B::f() is called.这样也就实现了动态多态程序可以按照我们期望的方式正确输出。
三. 总结
建议在基类中如果含有虚函数就将类的析构函数声明为虚析构函数以避免在调用时发生错误。