C++中的函数签名和继承
Function signature and inheritance in C++
假设我有两个 classes A
和 B
并且 B
导出 A
.
Class答:
class A
{
public:
virtual const unsigned char* getArray()
{
return array;
}
protected:
unsigned char array[250];
};
Class乙:
class B : public A
{
public:
virtual unsigned char* getArray()
{
return array;
}
};
我可以创建一个 class C 来执行此操作吗?
class C
{
public:
const unsigned char* getArrayMiddle(A &a)
{
return (a.getArray() + 125);
}
unsigned char* getArrayMiddle(B &b)
{
return (b.getArray() + 125);
}
};
通过这个简单的例子,我想知道我是否可以在 class C
中创建两个方法,其中一个方法返回一个 const 指针(如果对象的类型需要它)收到。
编译器是否会根据参数的类型自动调用 C
中的正确方法,即使 B
派生 A
?
澄清一下,如果我有
A* obj = new B();
C c;
c.getArrayMiddle(*obj);
将调用哪个函数?会不会造成意想不到的情况?
Will the compiler automatically call the right method in C
depending on the type of the parameter, even if B
derives A
?
编译器将根据参数表达式的 static(编译时)类型将方法调用解释为两种方法中的任何一种。我想,您是否认为这是 正确的 方法取决于您希望被调用的方法。
如果参数的静态类型是B &
,那么第二个变体(返回unsigned char *
)将被调用。如果它不是 B &
而是 A &
,那么将调用第一个变体(返回 const unsigned char *
)。
确定在何种情况下调用哪个重载方法的精确规则非常复杂,但一般来说,更具体 合适的候选者通常是首选。在这种情况下 B &
比 A &
更具体,因此如果参数确实是 B &
,它将被调用,即使在这种情况下它可以简单地转换为 A &
] 由于继承层次。
但是,值得注意的是(根据 cpplearner 的评论)您发布的代码不应编译。 B
不应该能够用删除 const
限定符的版本覆盖 getArray
。 G++ 5.4 将此诊断为错误。您可以不让一种方法覆盖另一种方法:删除 virtual
说明符,或给它们不同的名称,或将 A
中的函数标记为 const
函数(因此 const
中的函数=11=] 实际上并没有覆盖它。
假设我有两个 classes A
和 B
并且 B
导出 A
.
Class答:
class A
{
public:
virtual const unsigned char* getArray()
{
return array;
}
protected:
unsigned char array[250];
};
Class乙:
class B : public A
{
public:
virtual unsigned char* getArray()
{
return array;
}
};
我可以创建一个 class C 来执行此操作吗?
class C
{
public:
const unsigned char* getArrayMiddle(A &a)
{
return (a.getArray() + 125);
}
unsigned char* getArrayMiddle(B &b)
{
return (b.getArray() + 125);
}
};
通过这个简单的例子,我想知道我是否可以在 class C
中创建两个方法,其中一个方法返回一个 const 指针(如果对象的类型需要它)收到。
编译器是否会根据参数的类型自动调用 C
中的正确方法,即使 B
派生 A
?
澄清一下,如果我有
A* obj = new B();
C c;
c.getArrayMiddle(*obj);
将调用哪个函数?会不会造成意想不到的情况?
Will the compiler automatically call the right method in
C
depending on the type of the parameter, even ifB
derivesA
?
编译器将根据参数表达式的 static(编译时)类型将方法调用解释为两种方法中的任何一种。我想,您是否认为这是 正确的 方法取决于您希望被调用的方法。
如果参数的静态类型是B &
,那么第二个变体(返回unsigned char *
)将被调用。如果它不是 B &
而是 A &
,那么将调用第一个变体(返回 const unsigned char *
)。
确定在何种情况下调用哪个重载方法的精确规则非常复杂,但一般来说,更具体 合适的候选者通常是首选。在这种情况下 B &
比 A &
更具体,因此如果参数确实是 B &
,它将被调用,即使在这种情况下它可以简单地转换为 A &
] 由于继承层次。
但是,值得注意的是(根据 cpplearner 的评论)您发布的代码不应编译。 B
不应该能够用删除 const
限定符的版本覆盖 getArray
。 G++ 5.4 将此诊断为错误。您可以不让一种方法覆盖另一种方法:删除 virtual
说明符,或给它们不同的名称,或将 A
中的函数标记为 const
函数(因此 const
中的函数=11=] 实际上并没有覆盖它。