目录
一.单例模式和相关习题
1.不能在外部环境创建该类对象
方法:
代码:
2.创建一个不能被继承的类
方法:
3.创建一个不能被继承,但是可以在外部环境中创建该类对象
方法:
编辑
4.一个能被继承的类,但不能在外部环境中创建该类的对象
一.单例模式和相关习题
前情概要:无论是公有继承还是私有继承,派生类的方法是可以访问自身的公有,保护和私有的,还可以访问基类的保护和公有的。在派生类中,基类的保护类似于公有,是可以访问的。但是在外部环境中是不可以访问保护和私有属性的对象或方法。
1.不能在外部环境创建该类对象
方法:
单例模式:只能创建一个对象,只能使用方法去调动静态对象,而静态对象只有一份,因此可以达到只能创建一个对象,而其的构造函数被私有化,所以不能在外部环境创建该类对象。为了防止用一个对象去赋值另一个对象我们将其赋值重载删除,为防止用一个对象初始化另外一个对象,我们将其的拷贝构造函数删除,从而达到只能通过调用公有的方法去访问私有的构造函数。
代码:
class Single {
int value;
private:
Single(int x = 0) :value(x) {}
Single(const Single&)=delete;
Single& operator=(const Single&)=delete;
public:
~Single(){}
static Single& getInstance() {
static Single s(10);
return s;
}
};
int main() {
Single& s2 = Single::getInstance();//只能调用公有的方法去调用私有的构造函数
//Single* sp = (Single*)malloc(sizeof(Single));
//*sp = s2;为了防止一个对象赋值另外一个对象,我们把其赋值语句删除掉
}
2.创建一个不能被继承的类
方法:
将构造函数设置为私有的,派生类只能访问基类的保护和公有的属性和方法,不能访问基类的私有属性
class Object {
private:
Object() {
}
public:
~Object(){}
};
class Base :public Object {
public:
Base() :Object() {
}
};
此时就不能继承Object这个类,因为他的构造方法我们无法访问到
3.创建一个不能被继承,但是可以在外部环境中创建该类对象
方法:
final关键字 表示最终类不能被继承,但是该类可以在外部环境中可以创造对象,因为其构造函数是公有属性
代码:
class Object final{
private:
public:
Object() {}
~Object(){}
void show()const{}
};
class Base :public Object {
public:
Base() :Object() {}
};
int main() {
Object o1;
o1.show();
}
4.一个能被继承的类,但不能在外部环境中创建该类的对象
方法:
将构造函数等变成保护类型:一个能被继承的类,但不能在外部环境中创建该类的对象
限制派生类对象不可拷贝和赋值:将基类的拷贝和赋值删掉
代码:
class Object {
private:
protected:
Object() {}
public:
Object(const Object&) = delete;
Object& operator=(const Object&) = delete;
~Object(){}
void show()const{}
};
class Base :public Object {
public:
Base() :Object() {}
};
int main() {
Object o1;
o1.show();
}
好了,关于c++继承相关的内容就学习到介里啦,后续就是c++的多态相关知识,包括虚函数,编联等相关内容。还有就是到了期末复习周呜呜呜,可能更新速率会慢一些