Presence of a Pure Virtual Function
可以静态调用纯虚函数,而不能通过虚拟机制调用。在调用时,如果你未定义该纯虚函数,则可以通过编译阶段,但在链接阶段产生错误。
#include <iostream>
class A {
public:
virtual void vf() const = 0;
};
void A::vf() const { std::cout << "virtual void A::vf() const\n"; }
class D: public A {
public:
virtual void vf() const{ this->A::vf(); std::cout << "virtual void B::vf() const\n"; }
};
int main(int argc, char* argv[])
{
D o;
o.vf();
return 0;
}
结果为:。
5.1 “无继承”下的对象构造
对象产生 三种 方式:global、local、heap。
C中,global没有明确定义初始化操作,被视为“临时性的定义”,因此可定义多次,而多个实例被链接器折叠,只剩一个实体,放在data segment中的BSS空间(用于存放未初始化数据)之内。
C++中,global被视为完全定义,即仅限定义一次,而且已初始化。
Abstract Data Type
inline X::X(int x = 0): __x (x) {}将比 x.__x = x; 更高效,因为当函数的activation record被放入initialization list常量就可进入object的内存。
若: X o; // => X o; o.__x = 0; 被扩展成简单的 member_by_member常量指定。
而:X *p = new X; //=> X *p = __new( sizeof (X)); if(p != o) p->X::X( ); 调用默认构造函数。
为继承作准备
若class中含virtual function,则将会增加 vptr ,且引发 class 的代码膨胀作用。
如定义类X:
class X { public: X(int x = 0): _x = x {} virtual void vf() const; }
则类X的构造函数,将被如下扩展:
X::X(X *this, int x= 0) { this->_vptr_X = vtbl_point; this->_x = x; }
5.2 继承体系下的对象构造
当执行 T object; 时,将伴随:
1、记录member initialization list中data members初始化操作按声明顺序放进 constructor 函数。
2、如data member object未出现在member initialization list、但有default constructor,则调用该constructor。
3、如有virtual ,则指定适当 vptr。
4、所有base class constrcutor
#include <iostream>
using namespace std;
class A {
public:
A& operator= (const A& t)
{
std::cout << "virtual A& A::operator= (const A& t)" << endl;
return *this;
}
};
class B: virtual public A { };
class C: virtual public A { };
class D: public B, public C { };
int main(int argc, char* argv[])
{
D d1, d2;
d1 = d2;
return 0;
}
运行结果: