一、相关问题:

1. 基类、派生类的构造和析构顺序

2. 基类、派生类中virtual的取舍

二、测试代码:

#include <iostream>
class A {
public:
A() {
std::cout << "A()" << std::endl;
}
virtual void print() { std::cout << "A print()" << std::endl; }
virtual ~A() {
std::cout << "~A()" << std::endl;
}
};
class B : public A {
public:
B() : A(){
std::cout << "B()" << std::endl;
}
virtual void print() { std::cout << "B print()" << std::endl; }
virtual ~B() {
std::cout << "~B()" << std::endl;
}
};
void print() { }
int main(int argc, char *argv[])
{
A* c = new B();
c->print();
delete c;
return 0;
}

三、探讨与结论:

1. 基类、派生类的构造和析构顺序为:基类构造-派生类构造-派生类析构-基类析构

上述代码输出结果为:

2. 基类、派生类中virtual的取舍:若要实现动态绑定,基类中virtual关键字不可舍弃,派生类中virtual关键字可有可无;若基类中有关键字virtual,则普通函数调用派生类函数,析构函数先调用派生类,再调用基类;若基类中无关键字virtual,则普通函数和析构函数均只调用基类函数。

测试代码1:基类无关键字virtual

#include <iostream>
class A {
public:
A() {
std::cout << "A()" << std::endl;
}
void print() { std::cout << "A print()" << std::endl; }
~A() {
std::cout << "~A()" << std::endl;
}
};
class B : public A {
public:
B() : A(){
std::cout << "B()" << std::endl;
}
virtual void print() { std::cout << "B print()" << std::endl; }
virtual ~B() {
std::cout << "~B()" << std::endl;
}
};
void print() { }
int main(int argc, char *argv[])
{
A* c = new B();
c->print();
delete c;
return 0;
}

输出结果为:

测试代码2:派生类无关键字virtual

#include <iostream>
class A {
public:
A() {
std::cout << "A()" << std::endl;
}
virtual void print() { std::cout << "A print()" << std::endl; }
virtual ~A() {
std::cout << "~A()" << std::endl;
}
};
class B : public A {
public:
B() : A(){
std::cout << "B()" << std::endl;
}
void print() { std::cout << "B print()" << std::endl; }
~B() {
std::cout << "~B()" << std::endl;
}
};
void print() { }
int main(int argc, char *argv[])
{
A* c = new B();
c->print();
delete c;
return 0;
}

输出结果为:

最新文章

  1. HDU 2896 病毒侵袭
  2. ☀【document / location】
  3. SQL拾遗
  4. SOAP详解
  5. HDU 5868 Different Circle Permutation
  6. python_13 面向对象
  7. Gitlab中README.MD编写格式模板
  8. Ubuntu 进入、退出命令行的快捷键
  9. Java JDK1.5、1.6、1.7新特性整理
  10. Git 推送操作
  11. javaweb笔记—01(编程英语、常识、Tomcat配置问题)
  12. ASP.NET Web API 框架研究 Controller创建过程与消息处理管道
  13. Linux系统资源查看 之 资源信息
  14. 〖Android〗酷派手机固件.cpb文件的分解程序
  15. asp.net 在线解压缩文件类
  16. oracle数据库之游标的使用
  17. 【openjudge】C15C Rabbit&#39;s Festival CDQ分治+并查集
  18. Android如何获取屏幕的分辨
  19. c++虚析构函数的使用及其注意点
  20. 2017.11.21 查询某个字段为null的记录

热门文章

  1. 记ASP.NET 使用 X509Certificate2 出现的一系列问题
  2. ASP.Net与JSP如何共享Session值
  3. use ROW_NUMBER() for pagination in Oracle and SQLServer
  4. java基础(十) 数组类型
  5. 【转】教你弄清 OSX 的睡眠模式,以及合法的禁止产生 sleepimage
  6. 转:.net设计模式之工厂模式
  7. 如何快速的给你的项目添加icon图标
  8. Hybris阶段总结(2)hybris架构
  9. 铁乐学Python_day07_集合and浅谈深浅copy
  10. win10想说爱你不容易——安装.net3.5也是一个坑(已有完美解决方法)