C++学习大纲:纯虚函数和抽象类

C++学习大纲:纯虚函数和抽象类

C++ 纯虚函数和抽象类

1. 纯虚函数

定义格式:在函数原型后面加上符号 “=0”

class A

{

...

public:

virtual int f()=0;

}

2. 抽象类

包含纯虚函数的类成为抽象类,用于为派生类提供一个基本框架和一个公共的对外接口,派生类(或派生类的派生类...),应对抽象基类的所有纯虚成员函数进行实现。(形式上跟Java的抽象类有点像,作用跟Java的接口有点像)

————————————————


C++学习大纲:纯虚函数和抽象类

C++ 类(纯虚函数和抽象类)

文章概述:

纯虚函数和抽象类的基本概念;

抽象类案例;

抽象类在多继承中的应用以及工程中的多继承;

多继承的应用场景

纯虚函数和抽象类的基本概念

a. 纯虚函数是一个在基类中只有声明的虚函数,在基类中无定义。要求在任何派生类中都定义自己的版本;

b. 纯虚函数为各派生类提供一个公共界面(接口的封装和设计,软件的模块功能划分);

virtual void func()=0; //纯虚函数

d. 一个具有纯虚函数的类称为抽象类。

//抽象类

class A

{

public:

virtual void func() = 0;

};

class B:public A

{

public:

virtual void func()

{

cout << "实现父类的纯虚函数" << endl;

}

};

int main()

{

B b;

b.func();

return 0;

}


结论: (1). 抽象类对象不能做函数参数,不能创建对象,不能作为函数返回类型;

A a;(×); //不能创建抽象类的对象

void func(A a);(×) //不能做函数参数

A func(); (×) //不能作为函数的返回值


(2). 可以声明抽象类指针,可以声明抽象类的引用;

A * a; (√) //可以声明抽象类的指针

A & a; (√) //可以声明抽象类的引用


(3). 子类必须继承父类的纯虚函数才能创建对象。

抽象类案例

//抽象类

class Shape

{

public:

int x, y;

public:

void set(int x, int y)

{

this->x = x;

this->y = y;

}

virtual void S()=0;

};

class Cirle :public Shape

{

public:

void S()

{

cout << "x+y" << x + y << endl;

}

};

class Pirle :public Shape

{

public:

void S()

{

cout << "x-y" << x - y << endl;

}

};

class Dirle :public Shape

{

public:

void S()

{

cout << "x*y" << x * y << endl;

}

};

int main()

{

Shape* p;

Cirle c; c.set(1,2);

Pirle x; x.set(8,6);

Dirle d; d.set(8,5);

p = &c; p->S();

p = &x; p->S();

p = &d; p->S();

return 0;

}


抽象类在多继承中的应用以及工程中的多继承

a. 抽象类在多继承中的应用:C++中没有接口的概念,抽象类可以模拟接口类(协议:大家应该遵守的一种约定)。

b. 工程中的多继承:

被实际开发经验抛弃的多继承

工程开发中真正意义上的多继承是几乎不被使用的

多重继承带来的代码复杂性远多于其带来的便利

多重继承对代码维护性上的影响是灾难性的

在设计方法上,任何多继承都可以用单继承代替

多继承可以解决的问题:

C++学习大纲:纯虚函数和抽象类

多继承解决不了这个问题:

C++学习大纲:纯虚函数和抽象类

多继承的应用场景

a. C++没有接口的概念,可以使用纯虚函数实现接口,接口类中只有函数原型的定义,没有任何数据的定义。

b. 实际表明: 多继承接口不会带来二义性和复杂性等问题;多重继承可以通过设计好的单继承和接口代替;接口类只是一个功能说明,不是功能实现;子类需要根据功能说明定义功能的实现。

c. 多继承—->单继承+继承多个接口

class Parent

{

public:

int a;

int b;

};

class InterfaceOne

{

public:

virtual void print()=0;

virtual void sum(int a,int b)=0;

};

class InterfaceTwo

{

public:

virtual void print() = 0;

virtual void jsd(int a,int b) = 0;

};

//子类继承接口,必须实现其定义

class child:public Parent,public InterfaceOne,public InterfaceTwo //两个接口中的函数可以重复

{

public:

virtual void print()

{

cout << "子类实现父类的接口" << endl;

}

virtual void sum(int a, int b)

{

cout << "a+b=" << a + b << endl;

}

virtual void jsd(int a, int b)

{

cout << "a-b=" << a - b << endl;

}

};

int main()

{

child c;

c.print();

InterfaceOne* one = &c;

one->sum(4,5);

InterfaceTwo* two = &c;

two->jsd(5,6);

return 0;

}


面向抽象类编程—————–>面向接口编程

————————————————

C++学习大纲:纯虚函数和抽象类

通过分享实用的计算机编程语言干货,推动中国编程到2025年基本实现普及化,使编程变得全民皆知,最终实现中国编程之崛起,这里是中国编程2025,感谢大家的支持。

原文链接:https://blog.csdn.net/wue1206/article/details/81283280

原文链接:https://blog.csdn.net/haitaolang/article/details/70847172


分享到:


相關文章: