zoukankan      html  css  js  c++  java
  • 覆盖

    例题1:

    #include <iostream>
    using namespace std;
    
    class A {
    protected:
    		int m_data;
    public:
    	A(int data = 0) {
    		m_data = data;
    	}
    	
    	int GetData() {
    		return doGetData();
    	}
    	
    	virtual int doGetData() {
    		return m_data;
    	}
    };
    
    class B : public A {
    protected:
    	int m_data;
    public:
    	B(int data = 1) {
    		m_data = data;
    	}
    	
    	int doGetData() {
    		return m_data;
    	}
    };
    
    class C : public B {
    protected:
    	int m_data;
    public:
    	C(int data = 2) {
    		m_data = data; 
    	}
    };
    
    int main() {
    	C c(10);
    	
    	cout << c.GetData() << endl; // 1
    	cout << c.A::GetData() << endl; // 1
     	cout << c.B::GetData() << endl;// 1
    	cout << c.C::GetData() << endl; // 1
    
    	cout << c.doGetData() << endl; // 1
    	cout <<c.A::doGetData() << endl; // 0
    	cout <<c.B::doGetData() << endl; // 1
    	cout <<c.C::doGetData() << endl; //1
    
     	return 0;
    }
    

      

    析构函数从最初始的基类开始构造, 各个类的同名变量没有形成覆盖, 都是单独的变量, 这是重要的 C++ 特性

    对于 cout << c.GetData() << endl;

    本来是要调用 c 的函数, c 并未定义, 因此去 c 的基类 B 寻找. B 依然没有, 再去 A 寻找, A 找到. 然后调用 doGetData() 函数, 该函数是虚函数, 因此再次从 C , 然后 B, B 找到, 返回 1

    接下来的四个函数分析和上面相同

    对于 cout << c.A::doGetData() << endl;

    直接调用 A 的函数, 返回 0

    例题2:

    class A {
    public:
    	void virtual f() {
    		cout << "A" << endl;
    	}
    };
    
    class B {
    public:
    	void virtual f() {
    		cout << "B" << endl;
    	}
    };
    
    int main() {
    	A* pa = new A();
    	pa->f(); //A
    	B* pb = (B*) pa;
    	pb->f();//B
    
    	return 0;
    }
    

      

    B* pb = (B*) pa;

    这样操作, 只能改变静态类型, 动态类型保持不变

  • 相关阅读:
    Java暑期学习第二十天日报
    Java暑期学习第十六天日报
    Java暑期学习第十七天日报
    使用C#创建SQLServer的存储过程 附带图片
    ASP.NET树形
    什么时候使用webservice1
    ASPxGridView动态增加列
    winform中treeView使用通用类
    Winform使用C#实现Treeview节点"正在展开..."效果
    C#实现字符串加密解密类
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3640286.html
Copyright © 2011-2022 走看看