网站首页 > 基础教程 正文
纯虚函数能实例化吗,为什么?派生类要实现吗,为什么?
- 纯虚函数不可以实例化,但可以用其派生类实例化
- 虚函数的原理采用vtable。类中含有纯虚函数时,其vtable不完全,有个空位。
纯虚函数在类vtable表中对应的表项被赋值为0。即,指向一个不存在的函数。由于编译器不允许调用一个不存在的函数,所以该类不能生成对象。它在派生类中,除非重写该函数,否则也不能生成对象。所以,纯虚函数不能实例化。
- 纯虚函数是在基类中声明的虚函数,它要求任何派生类都要定义自己的实现方法,以实现多态性。
- 定义纯虚函数是为了实现一个接口,用来规范派生类行为。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”
C++中虚函数与纯虚函数的区别
- 虚函数和纯虚函数可以定义在同一个类中。含有纯虚函数的类称为抽象类,只含有虚函数的类不能称为抽象类。
- 虚函数可以被直接使用,也可以被子类重载,以多态形式调用;纯虚函数必须在子类中实现函数才可以调用,因为纯虚函数在基类只有声明没有定义。
- 虚函数和纯虚函数都可以在子类中被重载,以多态的形式被调用。
- 虚函数和纯虚函数通常存在于抽象基类之中,被继承的子类重载,目的是提供一个统一的接口。
- 虚函数的定义形式:virtual{};纯虚函数的定义形式:virtual { } = 0;在虚函数和纯虚函数的定义中不能有static标识符,被static修饰的函数在编译时要求前期绑定,然而虚函数却是动态绑定,而且被两者修饰的函数生命周期也不一样。
C++ 中什么是菱形继承问题,如何解决
- B类和C类都继承A,D类通过多重继承继承了B类和C类。因为上述图表的形状类似于菱形,因此这个问题被形象地称为菱形继承问题。
/* *Animal类对应于图表的类A* */ class Animal { /* ... */ }; // 基类 { int weight; public: int getWeight() { return weight; } }; class Tiger : public Animal { /* ... */ }; class Lion : public Animal { /* ... */ } class Liger : public Tiger, public Lion { /* ... */ }
菱形继承结构会出现的问题:
int main( ) { Liger lg; /*编译错误,下面的代码不会被任何C++编译器通过 */ int weight = lg.getWeight(); }
- 在菱形继承结构中,我们可以看出Tiger和Lion类都继承自Animal基类。所以问题是:因为Liger多重继承了Tiger和Lion类,因此Liger类会有两份Animal类的成员(数据和方法),Liger对象"lg"会包含Animal基类的两个子对象。
解决方案:
如果Lion类和Tiger类在分别继承Animal类时都用virtual来标注,对于每一个Liger对象,C++会保证只有一个Animal类的子对象会被创建。
class Tiger : virtual public Animal { /* ... */ }; class Lion : virtual public Animal { /* ... */ };
int main( ) { Liger lg; /*既然我们已经在Tiger和Lion类的定义中声明了"virtual"关键字,于是下面的代码编译OK */ int weight = lg.getWeight(); }
请问构造函数中的能不能调用虚方法
不要在构造函数中调用虚方法。
派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。同样地,进入基类析构函数,对象也是基类类型。
所以,虚函数始终仅仅调用基类的虚函数(如果是基类调用虚函数),不能达到多态的效果。
请问拷贝构造函数的参数是什么传递方式,为什么
引用传递
原因:如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式,而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。所以拷贝构造函数的参数必须是一个引用。
类方法和数据的权限有哪几种
如何理解抽象类?
抽象类定义
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”,有虚函数的类就叫做抽象类。
抽象类特点
- 抽象类只能用作其他类的基类,不能建立抽象类对象。
- 抽象类不能用作参数类型、函数返回类型或显式转换的类型。
- 定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。
什么是多态?除了虚函数,还有什么方式能实现多态?
- 多态是面向对象的重要特性之一,它是一种行为的封装,就是不同对象对同一行为会有不同的状态。(举例 : 学生和成人都去买票时,学生会打折,成人不会)
- 多态是以封装和继承为基础的。在C++中多态分为静态多态(早绑定)和动态多态(晚绑定)两种,其中动态多态是通过虚函数实现,静态多态通过函数重载实现。
猜你喜欢
- 2024-11-12 金三银四不跳槽更待何时?安卓开发1年字节5面面经,已成功上岸
- 2024-11-12 C++要学到什么程度才能找到实习? c++学完学什么
- 2024-11-12 C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?
- 2024-11-12 C++基类中虚析构函数 c++ 虚析构函数
- 2024-11-12 C和C++代码精粹:C语言和C++有什么区别么?
- 2024-11-12 3个面试C++开发岗位的高频笔试题 c++软件开发面试
- 2024-11-12 一文在手,"类间关系"不再困惑
- 2024-11-12 c++的面试总结 c++面试知识点
- 2024-11-12 C++ 虚函数 实例学习 简单易懂 c++虚函数的使用
- 2024-11-12 C++里面的虚析构函数 虚构造函数与虚析构函数
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)