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

答案

使用Cinstanceof

Class#getClass()

A returned = getA(); if (returned instanceof B) { .. } else if (returned instanceof C) { .. } 将返回以下任何一个:getClass()A.classB.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 ,检查Stringsinstanceof方法在任何子类中。

另一答案

有两种方法我可以想到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++ - 无法从基类继承 |给出空值

C++ - 让派生类从基类“继承”重载赋值运算符的安全/标准方法

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?

从基类访问子类成员的首选方式

类的继承与派生

3.继承与派生