目录
析构函数
● 构造函数是一个类的特殊的类成员函数,该函数没有返回类型, 没有参数,也不能重载。一个类也只能有一个析构函数。
● 析构函数是为生命期即将结束的类对象返还相关的资源或者自动释放资源, 当该类的对象离开了它的作用域或 delete 表达式应用到一个该类的对象的指针上时, 析构函数会自动被调用。
● 有时候我们会使用new运算符进行了动态堆内存的开辟, 如果这样的类没有显示定义析构函数,那么在程序结束后, 动态堆内存并没有随着对象的消失而消失, 这样就会造成内存泄漏, 使系统内存不断减少, 系统效率大大降低。
class Person
{
public:
Person()
{
message = new char[10];
strcpy_s(message, strlen("huang") + 1, "huang");
cout << "构造函数被调用!" << endl;
}
~Person()
{
delete[]message;
cout << "析构函数被调用!" << endl;
}
void show()
{
cout << "显示值:" << message << endl;
}
private:
char *message;
};
int main()
{
Person myPersion;
myPersion.show();
system("pause");
return 0;
}
派生类对基类成员的访问权限
● 可以看出在公有继承中,基类中的成员在派生类中都保持原有的访问权限。 这就表明派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的保护成员和公有成员。
但不允许派生类的成员函数和普通函数访问基类中的私有成员,但可以通过基类的公有成员函数间接访问。
注意: 公有派生类的对象可以作为基类对象的处理。
class Base1
{
private:
int bl;
protected:
int b2;
public:
int b3;
};
class Derivation : public Base1
{
public:
void set()
{
b1 = 1; // 错误,公有继承的派生类成员函数不可以访问基类中的私有成员
b2 = 2; // 正确, 公有继承的派生类成员函数可以访问基类中的保护成员
b3 = 3; // 正确, 公有继承的派生类成员函数可以访问基类中的公有成员
}
};
int main()
{
Derivation d;
d.b1 = 1; //错误,派生类的对象不能访问基类中的私有成员
d.b2 = 2; //错误,派生类的对象不能访问基类中的保护成员
d.b3 = 3; //正确,派生类的对象能访问基类中的公有成员
}
● 私有继承的特点是: 公有成员和保护成员都为私有成员。并且不能被这个派生类的子类所访问。因此,在私有继承时,基类的成员只能被派生类的成员函数访问或者友元访问, 而无法继承下去。
那么派生类的成员函数可以访问基类中公有成员和保护成员, 但是派生类的对象不可以访问基类中的所有成员。
派生类成员函数不能直接访问基类中的私有成员,但可以在派生类的成员函数中通过基类的公有成员或保护成员间接访问。
class Base1
{
private:
int bl;
protected:
int b2;
public:
int b3;
};
class Derivation : private Base1
{
public:
void set()
{
b1 = 1; // 错误,公有继承的派生类成员函数不可以访问基类中的私有成员
b2 = 2; // 正确, 公有继承的派生类成员函数可以访问基类中的保护成员
b3 = 3; // 正确, 公有继承的派生类成员函数可以访问基类中的公有成员
}
};
int main()
{
Derivation d;
d.b1 = 1; //错误,派生类的对象不能访问基类中的私有成员
d.b2 = 2; //错误,派生类的对象不能访问基类中的保护成员
d.b3 = 3; //错误,派生类的对象不能访问基类中的公有成员
}
● 保护继承的特点是: 基类中的保护成员和公有成员在派生类中变成保护成员, 基类中的私有成员还是私有的。 并且只能被它的派生类成员函数或者友元访问。
那么派生类的成员函数可以访问基类中公有成员和保护成员, 但是派生类的对象不可以访问基类中的所有成员。
class Base1
{
private:
int bl;
protected:
int b2;
public:
int b3;
};
class Derivation : private Base1
{
public:
void set()
{
b1 = 1; // 错误,公有继承的派生类成员函数不可以访问基类中的私有成员
b2 = 2; // 正确, 公有继承的派生类成员函数可以访问基类中的保护成员
b3 = 3; // 正确, 公有继承的派生类成员函数可以访问基类中的公有成员
}
};
int main()
{
Derivation d;
d.b1 = 1; //错误,派生类的对象不能访问基类中的私有成员
d.b2 = 2; //错误,派生类的对象不能访问基类中的保护成员
d.b3 = 3; //错误,派生类的对象不能访问基类中的公有成员
}