博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用接口解决多继承带来的二义性问题
阅读量:4210 次
发布时间:2019-05-26

本文共 1478 字,大约阅读时间需要 4 分钟。

工程上的多继承

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

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

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

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

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

多继承中的二义性和多继承不能解决的问题

 

5.3.2多继承的应用场景

C++中是否有Java中的接口概念?

绝大多数面向对象语言都不支持多继承

绝大多数面向对象语言都支持接口的概念

C++中没有接口的概念

C++中可以使用纯虚函数实现接口

接口类中只有函数原型定义,没有任何数据的定义

class Interface

{

        public:

                 virtual void func1() = 0;

                 virtual void func2(int i) = 0;

                 virtual void func3(int i) = 0;

};

实际工程经验证明

多重继承接口不会带来二义性和复杂性等问题 

多重继承可以通过精心设计用单继承和接口来代替

接口类只是一个功能说明,而不是功能实现。

子类需要根据功能说明定义功能实现。

代码如下:

#include 
using namespace std;/**c++中没有接口的概念,但是c++中可以通过纯虚函数来定义一个接口,接口只是功能的说明,并没有功能的实现,用接口可以解决多继承中的二义性c++中多继承的问题完全可以通过单继承和接口实现,避免出现二义性的问题。*/class Interface1 //用纯虚函数来实现接口{public: virtual int add(int a, int b) = 0; virtual void print() = 0;};class Interface2 //让纯虚函数来实现接口{public: virtual int mult(int a, int b) = 0; virtual void print() = 0;};class Parent{public: virtual int getA() { a = 0; return a; }protected:private: int a;};class Child : public Parent, public Interface1, public Interface2{public: virtual int add(int a, int b) { cout << "Child: add()已经执行\n"; return a + b; } virtual void print() { cout << "Child: print()已经执行\n"; } virtual int mult(int a, int b) { cout << "Child: mult()已经执行\n"; return a * b; } virtual int getA() { cout << "我是孩子" << endl; return 0; }protected:private:};void main(){ Child c1; c1.print(); Parent* p = &c1; p->getA(); Interface1* it1 = &c1; it1->add(1, 2); Interface2* it2 = &c1; it2->mult(3, 6); cout << "hello..." << endl; system("pause"); return;}

 

转载地址:http://qrzmi.baihongyu.com/

你可能感兴趣的文章
mysql sp
查看>>
SELECT ... FOR UPDATE LOCK IN SHARE MOD
查看>>
恢复oracle数据到以前的某个时间点
查看>>
mysql kettle 分页
查看>>
mongoDB 入门指南、示例
查看>>
不存在插入的一种写法
查看>>
p_vipshop_to_actual_day_shop_sale
查看>>
写MySQL存储过程实现动态执行SQL
查看>>
P_sync_etl_mid_data
查看>>
js正则表达式语法
查看>>
常用正则表达式大全 (转)
查看>>
mysql版同步数据
查看>>
MySQL参数DELAY_KEY_WRITE的详细说明
查看>>
利用MYSQL 日志恢复
查看>>
mysql 大量数据插入(可用于数据添加字段不能添加的情况,因为会copy临时表。这样可以手动分批处理)
查看>>
MySQL数据库中表类型MyISAM与InnoDB的区别
查看>>
windows mysql忘记root密码的解决方法
查看>>
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
查看>>
MySql中启用InnoDB数据引擎的方法
查看>>
INNODB 热备工具试验与总结
查看>>