天天看點

《C++ Templates: The Complete Guide》第七章 模闆和繼承

作者:明政面朝大海春暖花開

在《C++ Templates: The Complete Guide》這本書中,繼承和多态性是C++程式設計中的重要概念。下面是一個簡單的例子來說明繼承和多态性的用法:

#include <iostream>

// 基類 Shape
class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a Shape." << std::endl;
    }
};

// 派生類 Circle
class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a Circle." << std::endl;
    }
};

// 派生類 Rectangle
class Rectangle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a Rectangle." << std::endl;
    }
};

int main() {
    Shape* shape1 = new Circle();
    Shape* shape2 = new Rectangle();

    shape1->draw();  // 調用 Circle 類的 draw() 函數
    shape2->draw();  // 調用 Rectangle 類的 draw() 函數

    delete shape1;
    delete shape2;

    return 0;
}
           

在上面的例子中,我們定義了一個基類 Shape 和兩個派生類 Circle 和 Rectangle。基類 Shape 中有一個虛函數 draw(),并且在派生類中進行了重寫。

在 main() 函數中,我們建立了兩個指向基類對象的指針 shape1 和 shape2,并分别使用 new 運算符将它們指向派生類的對象。

當我們調用 shape1->draw() 和 shape2->draw() 時,由于這兩個指針是指向派生類對象的,是以會根據對象的實際類型來調用相應的 draw() 函數。這就是多态性的展現,即同一個函數在不同的對象上表現出不同的行為。

在上述例子中,shape1->draw() 調用了 Circle 類的 draw() 函數,輸出了 "Drawing a Circle.";shape2->draw() 調用了 Rectangle 類的 draw() 函數,輸出了 "Drawing a Rectangle."。

這個例子展示了繼承和多态性在C++中的基本用法,通過繼承可以建立派生類,并且通過虛函數的重寫實作多态性,使得相同的函數調用可以表現出不同的行為。這在面向對象的程式設計中非常有用。

《C++ Templates: The Complete Guide》是一本關于C++模闆的權威指南,提供了詳細的介紹和示例。下面是關于基類模闆和派生類模闆的一些示例:

  1. 基類模闆(Base Class Templates)示例:
template <typename T>
class Base {
public:
    Base(T value) : data(value) {}
    void print() {
        std::cout << "Base: " << data << std::endl;
    }
private:
    T data;
};

// 使用基類模闆建立對象
Base<int> baseInt(10);
baseInt.print();  // 輸出:Base: 10

Base<std::string> baseString("Hello");
baseString.print();  // 輸出:Base: Hello
           

在這個示例中,Base 是一個模闆類,它有一個模闆參數 T,表示基類的資料類型。我們可以使用不同的類型執行個體化 Base 類,并調用 print 函數來列印基類的資料。

  1. 派生類模闆(Derived Class Templates)示例:
template <typename T>
class Derived : public Base<T> {
public:
    Derived(T value) : Base<T>(value) {}
    void print() {
        std::cout << "Derived: " << this->data << std::endl;
    }
};

// 使用派生類模闆建立對象
Derived<int> derivedInt(20);
derivedInt.print();  // 輸出:Derived: 20

Derived<std::string> derivedString("World");
derivedString.print();  // 輸出:Derived: World
           

在這個示例中,Derived 是一個派生類模闆,它繼承自 Base<T>。我們可以使用不同的類型執行個體化 Derived 類,并調用 print 函數來列印派生類的資料。注意,在派生類中,我們使用 this->data 來通路基類的資料。

這些示例展示了基類模闆和派生類模闆的基本用法,你可以根據自己的需要擴充和修改這些代碼。請注意,這隻是一個簡單的示例,實際使用中可能涉及更多的模闆特性和技巧。

《C++ Templates: The Complete Guide》是一本關于C++模闆的權威指南,它詳細介紹了模闆的各個方面。在書中,作者讨論了模闆類的繼承關系,并給出了一些示例。

在C++中,模闆類可以通過繼承來擴充和特化。下面是一個簡單的示例,展示了模闆類的繼承關系:

template <typename T>
class Base {
public:
    void foo() {
        std::cout << "Base foo" << std::endl;
    }
};

template <typename T>
class Derived : public Base<T> {
public:
    void bar() {
        std::cout << "Derived bar" << std::endl;
    }
};

int main() {
    Derived<int> d;
    d.foo(); // 調用Base類的foo函數
    d.bar(); // 調用Derived類的bar函數
    
    return 0;
}
           

在上面的示例中,Base是一個模闆類,它有一個foo函數。Derived也是一個模闆類,它通過繼承Base類來擴充功能,并添加了一個bar函數。

在main函數中,我們建立了一個Derived<int>的對象d。我們可以調用d的foo函數和bar函數,分别會輸出"Base foo"和"Derived bar"。

這個示例展示了模闆類的繼承關系,通過繼承,派生類可以繼承基類的成員函數和資料,并且可以添加自己的新成員函數和資料。這樣可以在不改變基類的情況下,對模闆類進行擴充和特化

繼續閱讀