深入理解C++的多态
2012-06-19 19:26
344 查看
一. 编译器对C++的多态是通过在Class里面插入一个vptr指针,同时生成一个virtual table, 让vptr指向这个virtual table来实现的,那么什么样的Class才有必要设置vptr指针呢?如下图所示:
下面分6种情况讨论
(1)有虚函数的基类
Cpp代码
class A {
public:
virtual void foo() {}
protected:
int i;
};
class A { public: virtual void foo() {} protected: int i; };
(2) 没有虚函数的基类
Cpp代码
class A {
public:
void foo() {}
protected:
int i;
};
class A { public: void foo() {} protected: int i; };
(3) 虚继承,基类有vptr
Cpp代码
class Base {
public:
virtual ~Base() {}
virtual void foo() {}
virtual void bar() {}
protected:
int i;
};
class Derived : public virtual Base {
public:
~Derived() {}
void bar() {}
protected:
int j;
};
class Base { public: virtual ~Base() {} virtual void foo() {} virtual void bar() {} protected: int i; }; class Derived : public virtual Base { public: ~Derived() {} void bar() {} protected: int j; };
(4)非虚继承,基类没有vptr,派生类没有虚函数
Cpp代码
class Base {
public:
~Base() {}
void foo() {}
void bar() {}
protected:
int i;
};
class Derived : public Base {
public:
~Derived() {}
void bar() {}
protected:
int j;
};
class Base { public: ~Base() {} void foo() {} void bar() {} protected: int i; }; class Derived : public Base { public: ~Derived() {} void bar() {} protected: int j; };
(5)非虚继承,基类没有vptr,派生类有虚函数
Cpp代码
class Base {
public:
~Base() {}
void foo() {}
void bar() {}
protected:
int i;
};
class Derived : public Base {
public:
~Derived() {}
virtual void bar() {}
protected:
int j;
};
class Base { public: ~Base() {} void foo() {} void bar() {} protected: int i; }; class Derived : public Base { public: ~Derived() {} virtual void bar() {} protected: int j; };
(6) 非虚继承,基类有vptr
Cpp代码
class Base1 {
public:
virtual ~Base1() {}
virtual void foo() {}
virtual Base1 *clone() const {}
protected:
int i;
};
class Base2 {
public:
virtual ~Base2() {}
virtual void bar() {}
virtual Base2 *clone() const {}
protected:
int j;
};
class Derived : public Base1, public Base2 {
public:
virtual ~Derived() {}
virtual Derived *clone() const {}
protected:
int k;
};
class Base1 { public: virtual ~Base1() {} virtual void foo() {} virtual Base1 *clone() const {} protected: int i; }; class Base2 { public: virtual ~Base2() {} virtual void bar() {} virtual Base2 *clone() const {} protected: int j; }; class Derived : public Base1, public Base2 { public: virtual ~Derived() {} virtual Derived *clone() const {} protected: int k; };
大小: 9 KB
查看图片附件
下面分6种情况讨论
(1)有虚函数的基类
Cpp代码
class A {
public:
virtual void foo() {}
protected:
int i;
};
class A { public: virtual void foo() {} protected: int i; };
(2) 没有虚函数的基类
Cpp代码
class A {
public:
void foo() {}
protected:
int i;
};
class A { public: void foo() {} protected: int i; };
(3) 虚继承,基类有vptr
Cpp代码
class Base {
public:
virtual ~Base() {}
virtual void foo() {}
virtual void bar() {}
protected:
int i;
};
class Derived : public virtual Base {
public:
~Derived() {}
void bar() {}
protected:
int j;
};
class Base { public: virtual ~Base() {} virtual void foo() {} virtual void bar() {} protected: int i; }; class Derived : public virtual Base { public: ~Derived() {} void bar() {} protected: int j; };
(4)非虚继承,基类没有vptr,派生类没有虚函数
Cpp代码
class Base {
public:
~Base() {}
void foo() {}
void bar() {}
protected:
int i;
};
class Derived : public Base {
public:
~Derived() {}
void bar() {}
protected:
int j;
};
class Base { public: ~Base() {} void foo() {} void bar() {} protected: int i; }; class Derived : public Base { public: ~Derived() {} void bar() {} protected: int j; };
(5)非虚继承,基类没有vptr,派生类有虚函数
Cpp代码
class Base {
public:
~Base() {}
void foo() {}
void bar() {}
protected:
int i;
};
class Derived : public Base {
public:
~Derived() {}
virtual void bar() {}
protected:
int j;
};
class Base { public: ~Base() {} void foo() {} void bar() {} protected: int i; }; class Derived : public Base { public: ~Derived() {} virtual void bar() {} protected: int j; };
(6) 非虚继承,基类有vptr
Cpp代码
class Base1 {
public:
virtual ~Base1() {}
virtual void foo() {}
virtual Base1 *clone() const {}
protected:
int i;
};
class Base2 {
public:
virtual ~Base2() {}
virtual void bar() {}
virtual Base2 *clone() const {}
protected:
int j;
};
class Derived : public Base1, public Base2 {
public:
virtual ~Derived() {}
virtual Derived *clone() const {}
protected:
int k;
};
class Base1 { public: virtual ~Base1() {} virtual void foo() {} virtual Base1 *clone() const {} protected: int i; }; class Base2 { public: virtual ~Base2() {} virtual void bar() {} virtual Base2 *clone() const {} protected: int j; }; class Derived : public Base1, public Base2 { public: virtual ~Derived() {} virtual Derived *clone() const {} protected: int k; };
大小: 9 KB
查看图片附件
相关文章推荐
- 深入理解C++多态
- C++多态:深入虚函数,理解晚绑定
- 深入理解C++重载、多态、虚函数
- c++ 多态深入理解
- 深入理解c++的多态
- C++多态:深入CRTP,理解编译期的多态
- C++多态、接口和虚基类的深入理解
- C++多态的实现机制深入理解
- 深入理解C++的多态
- 深入理解C++三大特性之一 ——多态
- 深入理解C++三大特性之一 ——多态
- C++箴言:理解隐式接口和编译期多态
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
- 深入理解C++对象模型之Data Member存取成本
- 深入理解 C++ Volatile变量
- 多态的概念和作用(深入理解)
- 深入理解JAVA多态原理
- 关于java继承与多态的深入理解
- 深入理解c++中virtual关键字
- 【ThinkingInC++】73、深入理解模板