《Inside the C++ Object Model》关于基类与派生类的Tips

简介: 近来阅读《Inside the C++ Object Model》,里边讲到,在C++中多态只存于public class体系中,且只有通过pointer和reference来间接处理。 #include <iostream>using std::cout;using std::endl;class Base{public: virtual void prin

近来阅读《Inside the C++ Object Model》,里边讲到,在C++中多态只存于public class体系中,且只有通过pointer和reference来间接处理。

#include <iostream>

using std::cout;
using std::endl;

class Base
{
public:
	virtual void printf(void)
	{
		cout<< "Base printf"<< endl;
	}
};

class Derv : public Base
{
public:
	virtual void printf(void)
	{
		cout<< "Derv printf"<< endl;
	}
};

int main(int argc, char** argv)
{
	Base* pBase = new Base();
	Derv* pDerv = new Derv();
	pBase = pDerv;
	pBase->printf();

	cout<<"-------------------------"<< endl;

	Base* pBase2 = new Derv();
	pBase2->printf();

	cout<<"-------------------------"<< endl;

	Base base;
	Derv derv;
	base = derv;
	base.printf();

	cout<<"-------------------------"<< endl;

	Derv derv2;
	Base &base2 = derv2;
	base2.printf();

	getchar();
	return 0;
}

结果如下:


 可见对象base并未调用派生类中的printf()函数,而是继续使用基类的函数。

 不知在哪见过,调用printf()函数时,指向它的this指针属于谁,那么就调用谁的printf();具体内容待找到后补上。

 例子:

 

#include <iostream>

using std::cout;
using std::endl;

class Base
{
public:
	Base(): m_nData(1){}

	virtual void printf(void)
	{
		cout<< m_nData<< endl;
	}

private:
	int m_nData;
};

class Derv : public Base
{
public:
	Derv() : m_nData(2){}
	virtual void printf(void)
	{
		cout<< m_nData<< endl;
	}

private:
	int m_nData;
};

int main(int argc, char** argv)
{
	Base* pBase = new Base();
	Derv* pDerv = new Derv();
	pBase = pDerv;
	pBase->printf();

	cout<<"-------------------------"<< endl;

	Base* pBase2 = new Derv();
	pBase2->printf();

	cout<<"-------------------------"<< endl;

	Base base;
	Derv derv;
	base = derv;
	base.printf();

	cout<<"-------------------------"<< endl;

	Derv derv2;
	Base &base2 = derv2;
	base2.printf();

	getchar();
	return 0;
}

结果如下:





相关文章
|
1月前
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
|
3月前
|
Java
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
6月前
|
C++
C++派生类
C++派生类
57 0
|
2月前
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
|
3月前
|
前端开发 Java 编译器
【前端学java】java中的Object类和前端中的Object有什么区别(9)
【8月更文挑战第10天】java中的Object类和前端中的Object有什么区别
40 0
【前端学java】java中的Object类和前端中的Object有什么区别(9)
|
3月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
35 5
|
3月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
|
4月前
|
Java
Java中的Object类 ( 详解toString方法 | equals方法 )
Java中的Object类 ( 详解toString方法 | equals方法 )
|
6月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
52 2
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
|
5月前
|
Java
【Java】Object类简单解析
【Java】Object类简单解析
62 1