标签:定义 border error 对比 fun hang order cccccc test
定义两个类A,B,其中B公有派生于A。A中定义一个private成员虚函数func,B中覆写此函数,但是将其访问权限设置为public
class A{ private: virtual void func(){ printf("A\n"); } }; class B : public A{ public: void func(){ printf("B\n"); } void do_func(){ func(); } }; int main() { /* test-1 * 编译报错,error: ‘virtual void A::func()’ is private * 分析:基类中virtual修饰函数的访问权限在派生类中最好不要改变,否则发挥多态性受到限制,对比 test-1 和 test-2 **/ A * b = new B; b->func(); /* test-2 * 编译,运行成功, * 输出:B **/ B * b = new B; b->func(); /* test-3 * 编译,运行成功, * 输出:B **/ A * b = new B; b->do_func(); return 0; }
现在有这样一种要求,构造的对象都基于既定的模板,不允许任意构造。比如新建一个人姓氏的类,但是姓氏是固定的,不允许随便构造新的姓氏,于是可以定义枚举类。将除了Family_Name(const char * name)以外的构造函数(拷贝,赋值)设为public。然后定义若干static Family_Name供用户使用。
注: 枚举类不能为抽象类
class Family_Name{ private: Family_Name(const char * name) :name_(name){} const char * name_; public: Family_Name(const Family_Name & other){ name_=other.name_; } Family_Name & operator=(const Family_Name & other){ name_=other.name_; return *this; } public: static Family_Name yang; static Family_Name zhang; static Family_Name liu; static Family_Name zhao; }; Family_Name Family_Name::yang("yang"); Family_Name Family_Name::zhang("zhang"); Family_Name Family_Name::liu("liu"); Family_Name Family_Name::zhao("zhao"); int main() { Family_Name a = Family_Name::yang; return 0; }
标签:定义 border error 对比 fun hang order cccccc test
原文地址:https://www.cnblogs.com/supersponge/p/8965668.html