专业编程基础技术教程

网站首页 > 基础教程 正文

c++ 虚函数需要注意的几个点 c++虚函数的实现原理

ccvgpt 2024-11-12 09:54:55 基础教程 5 ℃

1.派生类中定义虚函数必须与基类中的虚函数的函数签名一模一样即函数名相同 参数列表相同 返回值类型相同缺一不可

否则会被认为是重载而不是虚函数。如果基类中返回值是个基类指针,派生类中返回派生类指针是允许的这是个特例

c++ 虚函数需要注意的几个点 c++虚函数的实现原理

2.只有类的成员函数才能声明为虚函数,这是因为虚函数仅仅适用于有着继承关系的类对象

3.静态成员函数,是所有同一类对象共有的 不受限于某个对象,不可作为虚函数

4.一个类对象的静态和动态类型是相同的,实现动态特性必须使用基类类型的指针变量或引用 使该

指针指向该基类的不同派生类的对象,并通过该指针指向虚函数表才能实现动态的多态性

5.内联函数每个对象一个拷贝,无映射关系,不能作为虚函数

6.析构函数可以定义为虚函数,构造函数不可以定义为虚函数,因为在调用构造函数对象还没有完成实例化,

在基类中及其派生类中都动态分配内存空间时,必须把析构函数定义为虚函数,实现撤销对象的多态性

7.多态性要付出一定的代价,因为函数的调用要通过虚表间接调用。

============华丽的分割线===================

补充说明小例子:

class A

{

public:

void FuncA()

{

printf( "FuncA called\n" );

}

virtual void FuncB()

{

printf( "FuncB called\n" );

}

};

class B : public A

{

public:

void FuncA()

{

A::FuncA();

printf( "FuncAB called\n" );

}

virtual void FuncB()

{

printf( "FuncBB called\n" );

}

};

void main( void )

{

B b;

A *pa;

pa = &b;

A *pa2 = new A;

pa->FuncA(); ( 3)

pa->FuncB(); ( 4)

pa2->FuncA(); ( 5)

pa2->FuncB();

delete pa2;

}

父类指针指向子类实例对象,调用普通重写方法时会调用父类中的方法

在调用被子类重写的虚函数时会调用子类的方法。也就是只有虚函数才有动态性。


最近发表
标签列表