zoukankan      html  css  js  c++  java
  • C++多态下的访问修饰符

    C++多态下的访问修饰符

    先上代码:

    class Parent
    {
    public:
    	virtual void showMsg()
    	{
    		cout << "Parent showMsg()" << endl;
    	}
    };
    
    class ChildA : public Parent
    {
    public:
    	void showMsg() override
    	{
    		std::cout << "ChildA showMsg()" << std::endl;
    	}
    };
    
    class ChildB : public Parent
    {
    private:
    	void showMsg() override
    	{
    		std::cout << "ChildB showMsg()" << std::endl;
    	}
    };
    

    在这段代码里我们先定义了一个Parent类,然后定义了2个继承于它的子类ChildA和ChildB。

    我们在Parent类中声明且实现了一个名为showMsg()的函数,且此函数为虚函数,允许子类重写。我们在子类ChildA和ChildB中均重写了此函数,唯一不同的是ChildA中showMsg()函数的访问修饰符为public,ChildB中showMsg()的访问修饰符为private。我们知道public和private两个访问修饰符的区别是,public修饰符下函数允许外部访问,而private修饰符下的函数不允许外包访问(当然友元函数和友元类可以访问)。

    我们测试一下:

    int main()
    {
    	ChildA* cA = new ChildA;
    	cA->showMsg();
    
    	ChildB* cB = new ChildB;
    	cB->showMsg();
    
    
    	delete cB;
    	cB = nullptr;
    
        delete cA;
    	cA = nullptr;
    
        return 0;
    }
    

    编译报错:

    很显示然编译器提示我们,对于ChildB类,showMsg()函数是私有的,不能访问。

    我们修改一下测试代码:

    int main()
    {
    	ChildA* cA = new ChildA;
    	cA->showMsg();
    
    	Parent* cB = new ChildB;
    	cB->showMsg();
    
    	delete cB;
    	cB = nullptr;
    
        delete cA;
    	cA = nullptr;
    
        return 0;
    }
    

    再编译一下代码,代码通过编译,我们运行一下。

    可以看到实例化对象cB调用了类ChildB的showMsg()函数。ChildB的showMsg()函数不是私有的吗,为什么可以调用呢?

    其实通过上面测试不难看出,对于C++的访问修饰符public、protected、private来说,所谓的访问修饰只是在编译器有效,编译时编译器会根据访问修饰符,检测外部调用是否合法,不合法则报错。在运行期是不做访问权限检查的,因此在多态下,子类继承于父类具有多态性质的函数,只要父类的中的访问修饰符为public, 子类中的访问修饰符不论是public,还是private,都是可以通过父类指针的形式去访问的。

  • 相关阅读:
    ASP.NET 2.0 中的代码隐藏和编译
    魅族M8 UI新架构
    详细讲解大型数据库的设计原则与开发技巧
    [ZT]精彩的国外育儿教育读本,图文并茂
    企業導入ERP項目要防止「君子」作亂
    [ZT]VS2005 中 Lc.exe已退出,代码为 1,今天剛遇到就找了
    图像词汇
    VS2005 + VSS2005 的方法
    几种SQL Server数据库分页方式
    DB2 Express版与SQL Server标准版技术比较
  • 原文地址:https://www.cnblogs.com/chengjundu/p/11007742.html
Copyright © 2011-2022 走看看