C++中子类从基类都继承啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中子类从基类都继承啥?相关的知识,希望对你有一定的参考价值。
书里说是 所有可访问的数据域成员和函数 意思好像是public和protected 但是我看到书里的例子中private的数据域也被继承了 请问到底是继承了啥?
都可以继承,不过不同的东西继承的方法不一样。子类可以继承父类的属性(成员变量)和方法,也可以根据需要拓展自己的方法,即覆盖。具体如下:
①子类和父类在同一个包中时,子类可以继承父类的除private属性的所有方法和成员变量,当子类与父类不在同一个包中时,子类只能继承父类的protected和public属性的成员变量和方法。
②子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量;子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同,子类就隐藏从父类继承来的方法(方法的重写)。
③在子类中允许有一个方法和父类的方法名字相同而类型不同。 参考技术A 继承的是所有,能访问的是public和protected,也就是说,私有的,你可以继承,但不可见。只能通过共有的函数访问。本回答被提问者采纳 参考技术B private的数据域不会被继承,你书里的例子是啥样的?追问
就是定义了一个基类叫图形类,里面定义私有数据域:string color ,代表图形的边线色, bool isFilled 代表图形填充与否,这两个虽然是private的,但是都被子类继承了。。。
追答你子类里是怎么继承的,就是怎么访问了这两个成员?贴代码。
如何从基类实例中找出子类?
有没有办法从基类实例中找出派生类的名称?
e.f.:
class A{
....
}
class B extends A{
...
}
class c extends A{
...
}
现在,如果一个方法返回A
的一个对象,我能否知道它是qzexswpoi还是B
?
使用C
或instanceof
Class#getClass()
A returned = getA();
if (returned instanceof B) { .. }
else if (returned instanceof C) { .. }
将返回以下任何一个:getClass()
,A.class
,B.class
在if子句中你需要向下转换 - 即
C.class
也就是说,有时候认为使用((B) returned).doSomethingSpecificToB();
或instanceof
是一种不好的做法。您应该使用getClass()
来避免检查具体的子类,但我不能告诉您更多信息。
你尝试过使用polymorphism吗?
EG
instanceof
简短回答你的问题
有没有办法从基类对象中找出派生类的名称?
不,超类无法告诉子类的名称/类型。
你必须询问对象(这是一个子类的实例)并询问它是否是:Class A aDerived= something.getSomethingDerivedFromClassA();
if (aDerived instanceof B) {
} else if (aDerived instanceof C) {
}
//Use type-casting where necessary in the if-then statement.
一个特定的子类,或者称它为instanceof
方法。
有没有办法从基类实例中找出派生类的名称?
正如getClass()
所说,你可以使用这种非常简单的方法。
here
然后只需打印当前的abstract class A {
public final String getName() {
return this.getClass().getName();
}
}
class B extends A { }
class C extends A { }
名称:
class
输出:
B b = new B();
C c = new C();
System.out.println(b.getName());
System.out.println(c.getName());
没有必要存储额外的com.test.B
com.test.C
,检查Strings
或instanceof
方法在任何子类中。
有两种方法我可以想到1)一种使用Java反射API 2)另一种方法是使用instanceOf
其他方法可以是比较对象的对象,我不知道它可能是什么,你可以试试这个
您可以在子类的构造函数中执行此操作
override
所以
class A {
protected String classname;
public A() { this.classname = "A"; }
public String getClassname() { return this.classname; }
}
class B extends A {
public B() {
super();
this.classname = "B";
}
}
因为它被转换为“A”对象,它将调用“A”A a = new A();
a.getClassname(); // returns "A"
B b = new B();
b.getClassname(); // returns "B"
((A)b).getClassname(); // Also returns "B"
函数,但将返回由构造函数设置的值,该构造函数是“B”构造函数。
注意:在设置之前调用getClassname()
以上是关于C++中子类从基类都继承啥?的主要内容,如果未能解决你的问题,请参考以下文章
C++ - 让派生类从基类“继承”重载赋值运算符的安全/标准方法