Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Vererbung von C++-Funktionen: Wie gehe ich mit Mehrdeutigkeiten bei der Vererbung um?

Detaillierte Erläuterung der Vererbung von C++-Funktionen: Wie gehe ich mit Mehrdeutigkeiten bei der Vererbung um?

PHPz
PHPzOriginal
2024-04-30 15:51:021166Durchsuche

Mehrdeutigkeit bei der Vererbung auflösen Wenn es eine Funktion mit demselben Namen gibt, können Sie die Mehrdeutigkeit mit der folgenden Methode auflösen: Verwenden Sie den Bereichsauflösungsprogramm (::), um die Klasse anzugeben, zu der die Funktion gehört. Überschreiben Sie Basisklassenfunktionen in abgeleiteten Klassen. Erstellen Sie einen Basisklassenzeiger auf das abgeleitete Klassenobjekt und verwenden Sie dann den Zeiger, um die Basisklassenfunktion aufzurufen.

C++ 函数继承详解:如何处理继承中出现的二义性?

Ausführliche Erklärung der C++-Funktionsvererbung: Umgang mit Mehrdeutigkeit bei der Vererbung

Mehrdeutigkeit bei der Vererbung

Wenn die Basisklasse und die abgeleitete Klasse eine Funktion mit demselben Namen haben, tritt beim Aufruf der Funktion in der abgeleiteten Klasse Mehrdeutigkeit auf Frage. Dies liegt daran, dass der Compiler nicht bestimmen kann, welche Funktionsversion aufgerufen werden soll.

Mehrdeutigkeiten auflösen

Es gibt mehrere Möglichkeiten, Mehrdeutigkeiten bei der Vererbung aufzulösen:

  1. Verwendung des Scope-Resolvers : Verwenden Sie den Scope-Resolver (::), um die Klasse anzugeben, zu der die Funktion gehört, die Sie aufrufen möchten.

    class Base {
    public:
     void func() { std::cout << "Base::func()" << std::endl; }
    };
    
    class Derived : public Base {
    public:
     void func() { std::cout << "Derived::func()" << std::endl; }
    
     void callBaseFunc() {
         Base::func();  // 使用作用域解析符调用基类函数
     }
    };
  2. Basisklassenfunktion überschreiben: Basisklassenfunktionen in abgeleiteten Klassen überschreiben.

    class Base {
    public:
     virtual void func() { std::cout << "Base::func()" << std::endl; }
    };
    
    class Derived : public Base {
    public:
     void func() override { std::cout << "Derived::func()" << std::endl; }
    };
  3. Basisklassenzeiger verwenden: Erstellen Sie einen Basisklassenzeiger und zeigen Sie auf das abgeleitete Klassenobjekt. Verwenden Sie dann den Zeiger, um die Basisklassenfunktion aufzurufen.

    class Base {
    public:
     void func() { std::cout << "Base::func()" << std::endl; }
    };
    
    class Derived : public Base {
    public:
     void func() { std::cout << "Derived::func()" << std::endl; }
    };
    
    int main() {
     Base* basePtr = new Derived;
     basePtr->func();  // 调用基类函数
     return 0;
    }

Praktischer Fall

Betrachten Sie den folgenden Code:

class Animal {
public:
    void speak() { std::cout << "Animal speaks" << std::endl; }
};

class Dog : public Animal {
public:
    void speak() { std::cout << "Dog barks" << std::endl; }
};

class Cat : public Animal {
public:
    void speak() { std::cout << "Cat meows" << std::endl; }
};

int main() {
    Animal* animal = new Dog;     // 创建指向 Dog 对象的 Animal 指针
    animal->speak();              // 调用 Dog::speak()
    animal = new Cat;            // 创建指向 Cat 对象的 Animal 指针
    animal->speak();              // 调用 Cat::speak()
    return 0;
}

In diesem Beispiel kann die Verwendung eines Basisklassenzeigers das Mehrdeutigkeitsproblem lösen. Wir können auf bestimmte Funktionen verschiedener abgeleiteter Klassen zugreifen, ohne den Code explizit zu ändern.

Fazit

Mehrdeutigkeit bei der Vererbung zu verstehen und zu wissen, wie man sie auflöst, ist entscheidend für das Schreiben von robustem und wartbarem C++-Code. Mithilfe der angegebenen Techniken können Sie Unklarheiten leicht beheben und sicherstellen, dass die richtige Funktion aufgerufen wird.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Vererbung von C++-Funktionen: Wie gehe ich mit Mehrdeutigkeiten bei der Vererbung um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn