C++ 定义继承方案
c++ definition inheritance scheme
代码可能写得不好,我想知道应该如何正确完成。
感谢帮助
对于如下继承方案:A→B→C
a) 定义 classes 假设 class A 是一个抽象 class
b) 为所有 classes 配备一个虚拟名称方法,返回 class 名称
c) 添加虚拟析构函数
d) 添加一个全局函数 friend class A 以便它可以执行与点 b
中相同的功能
#include <iostream>
using namespace std;
class A {
public:
A();
virtual void name();
{
return A;
}
friend void ffriend()
virtual ~A();
};
class B : public A{
public:
B();
virtual void name();
{
return B;
}
virtual ~B();
};
class C : public B{
public:
C();
virtual void name();
{
return C;
}
virtual ~C()
};
friend void ffriend(&A){
name.A();
}
您的代码无法编译并且有很多语法错误
b) equip all classes with a virtual name method returning the class name
这意味着配置文件可以
virtual const char * name();
或
virtual const char * name() const;
或
virtual std::string name();
或
virtual std::string name() const;
但不是 virtual void name()
a) define classes assuming that class A is to be an abstract class
所以至少有一个方法必须是抽象的,在你的情况下通常是 name
For the following inheritance scheme: A→B→C
可能是因为我为我做 UML,所以箭头方向错误,但是 A 很可能是抽象的 C 继承了 B 继承(实现)A
c) add virtual destructors
这是微不足道的,但不要忘记实现它们,而不仅仅是声明它们
d) add a global function friend of class A so that it can perform the same function as in point b
这通常意味着函数获得对 A 的引用,请注意在您的情况下声明和定义不对应,并且参数列表 (&A)
是无效
一个例子可以是:
#include <iostream>
class A {
public:
// default contructor is enough
virtual ~A() {} // c)
virtual const char * name() const = 0; // a) and b)
friend const char * ffriend(const A &); // d)
};
const char * ffriend(const A & a)
{
return a.name(); // or return "A" ?
}
class B : public A {
public:
// default contructor is enough
virtual ~B() {} // c)
virtual const char * name() const { return "B"; } // b)
};
class C : public B {
public:
// default contructor is enough
virtual ~C() {}
virtual const char * name() const { return "C"; } // b)
};
int main()
{
B b;
C c;
std::cout << b.name() << ' ' << c.name() << ' ' << ffriend(b) << std::endl;
}
编译与执行:
pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
B C B
pi@raspberrypi:/tmp $
不是很清楚 friend 函数必须 return 的名称,我认为是真正的 class 名称,但它可以是 "A" 要么。
还要注意 A 方法 name 可以是 private 以证明存在friend 方法,如果我能说的话。
代码可能写得不好,我想知道应该如何正确完成。
感谢帮助
对于如下继承方案:A→B→C
a) 定义 classes 假设 class A 是一个抽象 class
b) 为所有 classes 配备一个虚拟名称方法,返回 class 名称
c) 添加虚拟析构函数
d) 添加一个全局函数 friend class A 以便它可以执行与点 b
中相同的功能#include <iostream>
using namespace std;
class A {
public:
A();
virtual void name();
{
return A;
}
friend void ffriend()
virtual ~A();
};
class B : public A{
public:
B();
virtual void name();
{
return B;
}
virtual ~B();
};
class C : public B{
public:
C();
virtual void name();
{
return C;
}
virtual ~C()
};
friend void ffriend(&A){
name.A();
}
您的代码无法编译并且有很多语法错误
b) equip all classes with a virtual name method returning the class name
这意味着配置文件可以
virtual const char * name();
或
virtual const char * name() const;
或
virtual std::string name();
或
virtual std::string name() const;
但不是 virtual void name()
a) define classes assuming that class A is to be an abstract class
所以至少有一个方法必须是抽象的,在你的情况下通常是 name
For the following inheritance scheme: A→B→C
可能是因为我为我做 UML,所以箭头方向错误,但是 A 很可能是抽象的 C 继承了 B 继承(实现)A
c) add virtual destructors
这是微不足道的,但不要忘记实现它们,而不仅仅是声明它们
d) add a global function friend of class A so that it can perform the same function as in point b
这通常意味着函数获得对 A 的引用,请注意在您的情况下声明和定义不对应,并且参数列表 (&A)
是无效
一个例子可以是:
#include <iostream>
class A {
public:
// default contructor is enough
virtual ~A() {} // c)
virtual const char * name() const = 0; // a) and b)
friend const char * ffriend(const A &); // d)
};
const char * ffriend(const A & a)
{
return a.name(); // or return "A" ?
}
class B : public A {
public:
// default contructor is enough
virtual ~B() {} // c)
virtual const char * name() const { return "B"; } // b)
};
class C : public B {
public:
// default contructor is enough
virtual ~C() {}
virtual const char * name() const { return "C"; } // b)
};
int main()
{
B b;
C c;
std::cout << b.name() << ' ' << c.name() << ' ' << ffriend(b) << std::endl;
}
编译与执行:
pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
B C B
pi@raspberrypi:/tmp $
不是很清楚 friend 函数必须 return 的名称,我认为是真正的 class 名称,但它可以是 "A" 要么。
还要注意 A 方法 name 可以是 private 以证明存在friend 方法,如果我能说的话。