c++ tricks

1 关于virtual关键字的实验

1.1 在派生类中改变virtual函数访问权限

定义两个类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;
}

2 枚举类

现在有这样一种要求,构造的对象都基于既定的模板,不允许任意构造。比如新建一个人姓氏的类,但是姓氏是固定的,不允许随便构造新的姓氏,于是可以定义枚举类。将除了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;
}

猜你喜欢

转载自www.cnblogs.com/supersponge/p/8965668.html
今日推荐