C++ OOP Feature Conclusion (更新中)
Posted Charles Chou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ OOP Feature Conclusion (更新中)相关的知识,希望对你有一定的参考价值。
目录
1.3成员函数(对象所占空间取决于数据成员,和成员函数无关)
1.7对象数组(析构过程为栈)className instances[size] =Obj1(),Obj2(...),...
1.9对象成员的访问(成员运算符访问、指向运算符访问、引用)
1.11 对象的动态创建与释放 className *instance = new className(params...) ; delete instance
2.6多继承 class className:limitation baseClass1,limitation baseClass2...
3.4功能晚绑定(运行阶段,虚函数:virtual returnType functionName (params...))
4.2友元函数 friend returnType functionName(params...) 在类中声明
4.5静态成员函数(没有this指针,不能访问非静态成员,除非传入对象)
1.类与对象
1.1 基本概念(继承、封装、抽象、多态)
类
对象
访问限制符
1.2类的声明
1.3成员函数(对象所占空间取决于数据成员,和成员函数无关)
1.4数据成员(不能在类中初始化)
1.5构造与析构函数(自动执行,顺序为栈)
构造函数(系统提供默认构造函数)
参数初始化表
重载
析构函数(只能有一个,不能重载,无参)
全局对象的调用时间
局部对象的调用时间
静态局部对象调用时间
1.6对象的定义
1.7对象数组(析构过程为栈)className instances[size] =Obj1(),Obj2(...),...
1.8对象指针(this)
1.9对象成员的访问(成员运算符访问、指向运算符访问、引用)
1.10对象与const
常对象(无法调用非const成员函数) const className instance() | className const instance()
常对象成员
常成员函数(只能访问数据成员,不能修改) returnType functionName(params...) const
常数据成员
指向对象的常指针(不能修改指针)className * const pointerName = &instance
指向常对象的指针(常对象只能用指向常对象的指针,不能使用普通指针)const className * pointerName
1.11 对象的动态创建与释放 className *instance = new className(params...) ; delete instance
1.12对象的赋值与复制
赋值(赋值运算符 = 默认重载,含指针数据成员的类必须自己实现运算符重载,否则产生指针悬挂问题 )object1 = object2
复制(拷贝构造函数:className (const className &obj)) className instance(instance1) | className instance = instance1
两者异同:
2.继承与派生(派生会自动屏蔽基类同名成员;)
2.1基本概念(三种继承方式)
2.2 单继承
2.3派生类构成
2.4访问属性
2.5构造与析构(先执行基类构造,后执行基类虚构)
构造 className(params...):baseClass(paramValue...)
2.6多继承 class className:limitation baseClass1,limitation baseClass2...
2.7对象关系(派生类可以赋值给基类)
3.多态与虚函数
3.1基本概念(编译时多态、运行时多态)
3.2向上类型转换
3.3功能早绑定(编译阶段)
3.4功能晚绑定(运行阶段,虚函数:virtual returnType functionName (params...))
3.5虚析构函数
3.6虚函数与重载的区别(p177)
3.7纯虚函数与抽象类
纯虚函数 virtual returnType functionName(params...) =0
抽象类 (具有一个纯虚函数的类为抽象类,只能作为接口,不能生成对象)
4.友元与静态
4.1基本概念
4.2友元函数 friend returnType functionName(params...) 在类中声明
4.3友元类 friend className
4.4静态数据成员(只能在类中声明,类外初始化)
4.5静态成员函数(没有this指针,不能访问非静态成员,除非传入对象)
5.运算符重载
5.1基本概念
5.2重载规则
6.泛型编程
6.1 基本概念
6.2 函数模板
函数模板定义
函数模板实例化(编译器自动识别)
模板参数(注意:c++不对模板参数做任何类型转换,需要手动转换。不能提供参数默认值)
模板函数重载(指的是模板函数也可以被普通函数重载)
6.3类模板
类模板定义
类模板实例化(className<TypeName> instance)
类模板参数(可以提供参数默认值,只能放在形参表的最右端,否则出错)
7.STL
algorithm.h
deque.h(双向队列)
functiona.h
iterator.h
vector.h(向量)
list.h(双向链表)
map.h(键值映射)
memory.h
numeric.h
queue.h(队列)
set.h(不重复集合和可重复集合)
stack.h(堆栈)
utility.h
指针与继承的关系 c++ oop
【中文标题】指针与继承的关系 c++ oop【英文标题】:Relationship between pointer and inheritance c++ oop 【发布时间】:2018-10-10 20:48:38 【问题描述】:谁能写一段c++的简短代码,说明指针和继承之间的关系。
我相信下面的代码是指我的问题
class Animal
public:
virtual void MakeSound(const char* pNoise) ...
virtual void MakeSound() ...
;
class Dog : public Animal
public:
virtual void MakeSound() ...
;
int main()
Animal* a = new Dog();
Dog* d = new Dog();
a->MakeSound("bark");
d->MakeSound("bark"); // Does not compile
return 0;
【问题讨论】:
【参考方案1】:您隐藏基类MakeSound
并覆盖其他MakeSound
,因此它不参与重载决议。在 Dog
中覆盖两者或都不覆盖,或者将其中之一重命名为 MakeNoise
。
【讨论】:
有人可以用完整的代码分享一个正确的解决方案吗? 解决什么问题?您发布了格式错误的程序,我列出了 3 种修复方法。 你能告诉我好不好用吗?虚空 MakeSound() ; int main() Animal* a = new Dog();狗* d = 新狗(); a->MakeSound("吠声"); d->MakeNoise("吠声"); // 不编译 return 0; 如果你真的想要,你可以拨打d->Animal::MakeSound("bark")
,但我不认为这是推荐的做法【参考方案2】:
这两者实际上几乎没有什么关系,一个交叉点是为了利用多态行为(虚拟成员),您必须使用指针或引用。如果您将派生实例分配给实际的基实例(而不是将派生的地址分配给基指针或使用派生实例初始化基引用),那么任何派生功能都将简单地丢失(通常称为该对象切片)。
请注意,在您的示例中,没有太多指向虚拟 void make_sound(char const *),更常见的是使用虚拟 void make_sound() 形式,并且派生类型知道要产生什么样的声音.
【讨论】:
你能推荐一个详细的代码来满足我的要求吗?以上是关于C++ OOP Feature Conclusion (更新中)的主要内容,如果未能解决你的问题,请参考以下文章