`

改善c++程序建议——重中之重的类(四)

阅读更多
建议55:地方对象切片

1、定义:
c++内存模型规定,如果出现继承结构,内存分布一定是先基类部分的数据,后派生类部分的数据。在派生类向基类映射的过程中,派生类的对象中基类部分的数据会被强行“切”掉。

2、注意:
多态的事先必须依靠指向同一类族的指针或是引用。否则,就可能出现著名的对象切片问题。所以,在既有继承又有虚函数的情况下,一定要地方对象切片。

3、代码示例
#include<iostream>
#include <string>
using namespace std;

class Bird
{
public:
	Bird(const string& name) : m_name(name){}
//	虚函数
	virtual string Feature() const
	{
		return m_name + " can fly.";
	}

protected:
	string m_name;
};

class Parrot : public Bird
{
public:
	Parrot(const string& name, const string& food)
		: Bird(name), m_food(food){}

	virtual string Feature() const
	{
		return (m_name + " can fly and likes to eat " + m_food);
	}

private:
	string m_food;
};

// 默认的
void DescribeBird(Bird bird)
{
	cout << bird.Feature() << endl;
}

// 引用版
/*
void DescribeBird(Bird& bird)
{
	cout << bird.Feature() << endl;
}
*/
//指针版
/*
void DescribeBird(Bird* bird)
{
	cout << bird.Feature() << endl;
}
*/

int main()
{
Bird bird1 ("Crow");
DescribeBird(bird1);
Parrot Bird2("Polly", "millet");
DescribeBird(bird2);  // 出乎意料
return 0;
}


建议56:在正确的场合使用恰当的特性

主要分析c++针对c的高级特性的代价,我们要恰当的使用它们,提高效率;

1)虚函数
虚函数机制的实现是通过虚函数表和指向虚函数表的指针来完成;
他是c++中众多运行时多态特性中开销最小的、最常用的机制,
a、因为在程序中每个类只有一个虚函数表的拷贝,所以它占用的空间不是很大;
b、在时间方面, 虚函数的调用开销包括两次整型加法的开销和一次指针间接引用的开销;

2)多重继承
针对于虚函数来说,对象内部有多个指针;
3)虚基类
虚基类与多重继承的情况一样,因为虚基类是为了多重继承而产生的,对象内部处理插入积累函数的指针外,还插入虚基类指针;

建议57: 将数据成员声明为private
1)用private修饰成员变量,可让数据成员隐藏起来,通过数据成员的Getter和Settr来实现访问控制,这样可以更加精确的控制成员可读性;
2)将数据成员隐藏于功能性的接口中,其实是为我们预留了以后改变实现决策的权利,并为以后的各种实现提供了弹性;
3)保持语法的一致性
坚持这一原则,我们就不必要在访问类成员方式的问题上再纠结而消耗时间;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics