C++进阶--构造函数和析构函数中的虚函数
//############################################################################
/*
任何时候都不要在构造函数或析构函数中调用虚函数
*/
class dog {
public:
string m_name;
dog(string name) {m_name = name; bark();}
virtual void bark() { cout<< "Woof, I am just a dog " << m_name << endl;}
};
class yellowdog : public dog {
public:
yellowdog(string name) : dog(string name) {...}
virtual void bark() { cout << "Woof, I am a yellow dog " << m_name << endl; }
};
int main ()
{
yellowdog mydog("Bob");
}
输出:
Woof, I am just a dog Bob.
/*
在构造的过程中,所有虚函数表现为非虚函数
为什么?
基类在派生类之前构造。
所以bark()的时候,yellowdog还没有构造
为什么Java中表现不一样?
Java和C++在定义对象的生命周期上有一个基本的差异
Java: 所有成员在构造函数运行前被null初始化。生命周期在构造函数之前已经开始
C++: 构造函数负责初始化成员。生命周期在构造函数结束之后才开始
调用对象中还未被初始化的部分是继承危险的
调用对象中已经被delete的部分也是危险的
*/
/*
解决方法 1:
不使用多态,使用初始化参数来产生运行时差异
*/
class dog {
public:
...
dog(string name, string color) {m_name = name; bark(color);}
void bark(string str) { cout<< "Woof, I am "<< str << " dog " << m_name << endl;}
};
class yellowdog : public dog {
public:
yellowdog(string name):dog(name, "yellow") {}
};
int main ()
{
yellowdog mydog("Bob");
}
输出:
Woof, I am yellow dog Bob
/*
解决方法 2:
使用私有静态成员函数,不同派生类可执行不同操作
*/
class dog {
public:
...
dog(string name, string woof) {m_name = name; bark(woof);}
dog(string name) {m_name = name; bark( getMyColor() );}
void bark(string str) { cout<< "Woof, I am "<< str << " dog " << m_name << endl;}
private:
static string getMyColor() {return "just a";}
};
class yellowdog : public dog {
public:
yellowdog(string name):dog(name, getMyColor()) {}
private:
static string getMyColor() {return "yellow";} //Why static?
};
int main ()
{
yellowdog mydog("Bob");
}
OUTPUT:
Woof, I am yellow dog Bob
C++进阶--构造函数和析构函数中的虚函数的更多相关文章
- 【校招面试 之 C/C++】第10题 C++不在构造函数和析构函数中调用虚函数
1.不要在构造函数中调用虚函数的原因 在概念上,构造函数的工作是为对象进行初始化.在构造函数完成之前,被构造的对象被认为“未完全生成”.当创建某个派生类的对象时,如果在它的基类的构造函数中调用虚函数, ...
- 在构造函数和析构函数中调用虚函数------新标准c++程序设计
在构造函数和析构函数中调用虚函数不是多态,因为编译时即可确定调用的是哪个函数.如果本类有该函数,调用的就是本类的函数:如果本类没有,调用的就是直接基类的函数:如果基类没有,调用的就是间接基类的函数,以 ...
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为 ...
- c++有关构造函数和析构函数中调用虚函数问题
今天看了一道迅雷的笔试题目,然后引起一段思考,题目如下: 下列关于虚函数的说法正确的是()A.在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效.B.在析构函数中调用类自己的虚函数,虚函数的 ...
- EC笔记,第二部分:9.不在构造、析构函数中调用虚函数
9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete ...
- C++箴言:避免构造或析构函数中调用虚函数
如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉.但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼. 正 ...
- 【C++】不要在构造函数或析构函数内调用虚函数
这个问题来自于<Effective C++>条款9:永远不要在构造函数或析构函数中调用虚函数 . 假设有如下代码: class Transaction {// 所有交易的基类 public ...
- C++:构造函数和析构函数能否为虚函数
原文:http://blog.csdn.net/xhz1234/article/details/6510568 C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可 ...
- C++构造与析构函数中调用虚函数的问题
前些天想把以前写的内存池算法重写一遍,跨平台是第一目标,当时突发奇想,因为不愿意做成一大堆#if..#end,所以想利用C++的多态性,但是怎么让内存池完好退出却没想到自认为完美的方案.但是一个很偶然 ...
随机推荐
- OpenCV 自定义任意区域形状及计算平均值 方差
opencv中有矩形的Rect函数.圆形的circl函数等,那么任意形状怎么取呢?方法1:点乘,将其形状与图像进行点乘,求其形状对应的图像形状:方法2:用findContours函数得对应的形状区域, ...
- 四则运算V1.1
作业:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/997 代码:https://coding.net/u/Dawnfox/p/f4 ...
- ATM-java
通过学习JAVA,我的进步不是很多,了解了不多的编程知识,但是我一直在进步,我发现我有很大的进步空间,每天都有一点点的进步使我每天都很充实.还记得我编写的第一个 经典程序“hello Word”.从那 ...
- java实现各种排序算法
java实现各种排序算法 import java.util.Arrays; public class SomeSort { public static void main(String[] args) ...
- 《DSP using MATLAB》Problem 5.14
说明:这两个小题的数学证明过程都不会,欢迎博友赐教. 直接上代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- MYSQL 常用函数大全
1. 数学函数 greatest(x1,x2,...,xn)返回集合中最大的值 least(x1,x2,...,xn) 返回集合中最小的值 rand()返回0到1内的随机值,可以通过提供一个参数(种子 ...
- 使用VUE搭建tab标签组件
Vue2.0 多 Tab切换组件简单封装,满足自己简单的功能,可以直接拿去使用! 首先上效果图: 功能简单介绍: 1.支持tab切换 2.支持tab定位 3.支持tab自动化 仿React多Tab实现 ...
- mysql修改用户密码
修改自己的密码(root用户,其它用户应该也差不多) 方法一: [root@localhost /]# mysqladmin -u root -p password "root" ...
- 这样学习C语言最有效(高级技巧)——共勉
第一章 学习C语言的起跑线 1.1 C语言已死? 本资料描述的是使用C语言的高级技巧,力求将你的C语言能力由"基础"提升为"高级".但是学习态度胜过学习方法,在 ...
- Windows 2008 R2环境下DHCP服务的安装部署使用
(第一版本) 这个实验好像需要在部署了activity directory服务的基础上的,给个直达链接 http://blog.csdn.net/qq_34829953/article/details ...