
所谓继承,就是指子类“是一种”基类。所以子类一定会具备基类的所有特征。
子类无法访问基类的私有成员,所以必须调用父类的构造函数来初始化父类的成员。
对於子类来说,它不是“不会调用父类的构造函数”,而是“隠藏”了它。必要时候,你还是可以用特殊方法显式调用的。
为了达到你的目的,你有两个选择:
一,为基类提供一个怠工(dummy)构造函数,不作为。
二,声明为虚函数。
BTW,构造函数唯一的目的在於初始化对象。获取资源而不初始化,有悖RAII原则。所以基本上,第一种情况不大可能出现。
请记住,C++中,括号"()"除了用来判定表达式优先级之外,它还是 *** 作符。
这个 *** 作符叫做“函数调用 *** 作符”,又可以用作“类型构造 *** 作符”,它还可以用来作为C风格的“类型转换 *** 作符”。
比如,你可以这样定义一个整数,并将其初始化为8:
#include <iostream>
int main(int argc, char argv[])
{
int aInteger(8); // 注意这里我是怎么初始化aInterger的。
std::cout << aInterger << std::end;
return 0;
}
在上面那个表达式中,“()”就代表“类型构造 *** 作符”。
当然了,当你使用“()”去调用函数时,它就是“函数调用 *** 作符”;当你用它去强制转换一个对象的类型(C风格)时,它就是“类型转换 *** 作符”。
所以,如果你要构造一个自定义类的对象时,可以使用“类型构造 *** 作符”。这将导致编译器为你调用构造函数。
比如你写了一个类,叫BaseItem显然你可以这样定义一个BaseItem对象:
BaseItem aItem; // 调用默认构造函数;
你还可以这样定义一个BaseItem对象:
BaseItem aItem = BaseItem(); // 调用默认构造函数。这里"()"表示“类型构造 *** 作符”,
// 用来实例化一个对象
假如你的构造函数接受一个string对象作为参数,你还可以这样定义BaseItem:
BaseItem aItem("This is a base item"); // 这会使编译器为你调用相应的构造函数。
ok,上面的都明白了嘛?下面再开始讲类的构造函数和成员函数有什么区别。
(非静态)成员函数是通过对象/指向对象的指针/指向对象的引用来调用的。你只能通过这3种方式来调用一个成员函数。那么很显然,实质上无论如何要调用成员函数都必须通过对象。
比如BaseItem里面有一个成员函数叫memfunc,那么你可以这样调用它:
aItemmemfunc(parameters);
而构造函数却是用来构造对象的。在对象还没形成之前,你怎么能够通过对象去调用函数?所以你无法通过对象去调用构造函数。你只能采用上面我给出的那些形式,来显式(令编译器为你)调用构造函数。
而析构函数是用于销毁对象的。虽然构造函数和析构函数从实质上来说都是类的成员函数,然而因为它们和对象本身的生命周期有关,所以编译器不允许(逻辑上也不允许)你通过对象来调用它们。所以析构函数是编译器为你自动调用的。就是这样。
类是一级级继承下来的,父类中定义了的所有除final外的方法子类都可以重载或复盖,在父类中调用父类自己的方法时,如果该方法被继承了,那么JRE就会去执行继承过的方法了
很多时候,我们会把这一类型的类定义为abstract,在里面定义abstract的方法,让子类去实现,父类中的其它方法可以直接调用这个未实现的方法去处理东西
以上就是关于C++如何用父类访问子类函数呢全部的内容,包括:C++如何用父类访问子类函数呢、c++如何在父类成员函数中调用子类对象、父类的对象,怎样才能调用子类的子类的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)