在《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++模闆的權威指南,提供了詳細的介紹和示例。下面是關于基類模闆和派生類模闆的一些示例:
- 基類模闆(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 函數來列印基類的資料。
- 派生類模闆(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"。
這個示例展示了模闆類的繼承關系,通過繼承,派生類可以繼承基類的成員函數和資料,并且可以添加自己的新成員函數和資料。這樣可以在不改變基類的情況下,對模闆類進行擴充和特化