在类的层次结构中覆盖C ++

时间:2017-04-11 19:06:19

标签: c++ polymorphism

在这个类层次结构中的c ++中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin="16dp">

    <EditText
        android:id="@+id/etLogin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Login"
        android:inputType="textPersonName" />

    <EditText
        android:id="@+id/etPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Hasło"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/bLogin"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Loguj"
        android:layout_gravity="center_horizontal"/>

    <TextView
        android:id="@+id/tvRegister"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Nie masz jeszcze konta? Kliknij tutaj."
        android:layout_gravity="center_horizontal"/>
</LinearLayout>

在第三类中是否覆盖了n1虚函数,或者只是隐藏了n2实现?

在C#中我知道你可以在层次结构中的任何级别覆盖最低级别的虚拟方法。但我不知道它在C ++中是否相同。

class n1
{
public:
    virtual void tt() { cout << "n1" << endl; }
};
class n2:public n1
{
public:
     void tt() { cout << "n2" << endl; }
};
class n3:public n2
{
    void tt() { cout << "n3" << endl; }
};
int main()
{
    n1 *k = new n3;
    k->tt();
}

1 个答案:

答案 0 :(得分:4)

你压倒它。

如果你不确定你的覆盖是否正确,我们有一个名为Geeks For Geeks的关键字(需要c ++ 11),这可以确保你的覆盖符合虚函数/方法声明。

这应该清楚了:

#include <iostream>
using namespace std;

class n1
{
public:
    virtual void tt() { cout << "n1" << endl; }
};

class n2:public n1
{
public:
    void tt() override { cout << "n2" << endl; }
};

class n3:public n2
{
    void tt() override { cout << "n3" << endl; }
};

int main()
{
    n1 *a = new n1;
    n1 *b = new n2;
    n1 *c = new n3;

    a->tt();
    b->tt();
    c->tt();

    delete a;
    delete b;
    delete c;
}

输出:
N1
N2
N3

override

  

所以在3级层次结构中A-> B-> C如果A有虚方法而B实现它,它并不意味着从B派生的类将采用该方法

如果你覆盖它,那么将使用该覆盖。

Live

class n1
{
public:
    virtual void tt() { cout << "n1" << endl; }
};

class n2:public n1
{
public:
    void tt() override { cout << "n2" << endl; }
};

class n3:public n2
{

};

输出:
N1
N2
N2