多重继承的运用属于接口继承 interface inheritance
C++中 所有继承都是实现继承 implementation inheritance
因为在一个基类
接口和实现中的任何内容都将称为派生类的一部分
//: C09:Interfaces.cpp
// From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison.
// (c) 1995-2004 MindView, Inc. All Rights Reserved.
// See source code use permissions stated in the file 'License.txt',
// distributed with the code package available at www.MindView.net.
// Multiple interface inheritance.
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
class Printable {
public:
virtual ~Printable() {}
virtual void print(ostream&) const = 0;
};
class Intable {
public:
virtual ~Intable() {}
virtual int toInt() const = 0;
};
class Stringable {
public:
virtual ~Stringable() {}
virtual string toString() const = 0;
};
class Able : public Printable, public Intable,
public Stringable {
int myData;
public:
Able(int x) { myData = x; }
void print(ostream& os) const { os << myData; }
int toInt() const { return myData; }
string toString() const {
ostringstream os;
os << myData;
return os.str();
}
};
void testPrintable(const Printable& p) {
p.print(cout);
cout << endl;
}
void testIntable(const Intable& n) {
cout << n.toInt() + 1 << endl;
}
void testStringable(const Stringable& s) {
cout << s.toString() + "th" << endl;
}
int main() {
Able a(7);
testPrintable(a);
testIntable(a);
testStringable(a);
getchar();
} ///:~
输出
7
8
7th
类Able "实现"了接口Printable Intable Stringable
因为它提供了那些对它们进行声明的函数的实现
采用模板解决问题的方法将使程序更简洁
//: C09:Interfaces2.cpp
// From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison.
// (c) 1995-2004 MindView, Inc. All Rights Reserved.
// See source code use permissions stated in the file 'License.txt',
// distributed with the code package available at www.MindView.net.
// Implicit interface inheritance via templates.
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
class Able {
int myData;
public:
Able(int x) { myData = x; }
void print(ostream& os) const { os << myData; }
int toInt() const { return myData; }
string toString() const {
ostringstream os;
os << myData;
return os.str();
}
};
template<class Printable>
void testPrintable(const Printable& p) {
p.print(cout);
cout << endl;
}
template<class Intable>
void testIntable(const Intable& n) {
cout << n.toInt() + 1 << endl;
}
template<class Stringable>
void testStringable(const Stringable& s) {
cout << s.toString() + "th" << endl;
}
int main() {
Able a(7);
testPrintable(a);
testIntable(a);
testStringable(a);
getchar();
} ///:~
输出
7
8
7th
Printable Intable Stringable这些名字现在仅是模板参数
这些参数假设在各自的语境中表示存在的操作
测试函数可以接受任何一种类型的参数
参数类型与正确的识别标志和返回类型一起提供了一个成员函数的定义