我写下面的代码是为了解释我的问题.如果我注释第11行(使用关键字"using"),编译器不会编译该文件并显示以下错误:invalid conversion from 'char' to 'const char*'.它似乎没有void action(char)在Parent类中看到Son类的方法.
为什么编译器会以这种方式运行?或者我做错了什么?
class Parent
{
public:
virtual void action( const char how ){ this->action( &how ); }
virtual void action( const char * how ) = 0;
};
class Son : public Parent
{
public:
using Parent::action; // Why should i write this line?
void action( const char * how ){ printf( "Action: %c\n", *how ); }
};
int main( int argc, char** argv ) …Run Code Online (Sandbox Code Playgroud) 我以为我理解了继承,虚函数和函数重载,但我有一个案例,其中有关于这些特性之间的相互作用的事情让我望而却步.
假设我有一个包含重载虚函数的简单基类,以及从中派生的第二个类:
class b {
public:
virtual int f() { return 1; }
virtual int f(int) { return 2; }
};
class d : public b {
public:
virtual int f(int) { return 3; }
};
Run Code Online (Sandbox Code Playgroud)
请注意,派生类d仅覆盖其中一个重载的虚函数.
我可以实例化一个类的对象d并f(int)在其上调用,没问题:
d x;
std::cout << x.f(0) << std::endl;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试调用0参数函数时:
std::cout << x.f() << std::endl;
Run Code Online (Sandbox Code Playgroud)
它失败!gcc说"没有匹配函数来调用'd :: f()';候选者是:virtual int d :: f(int)".clang说"函数调用的参数太少,预期为1,有0;你的意思是'b :: f'吗?" 即使d派生出来的b是0-argument f()方法,编译器也会忽略它,并试图调用d1-argument方法.
我可以通过重复派生类中的0参数函数的定义来解决这个问题:
class d : public …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
#include <iostream>
#include <string>
using namespace std;
class A {
public: void Print(int i) {cout<<i;}
};
class B : public A {
public: void Print(string s) {cout<<s;}
};
int main() {
B bInstance;
bInstance.Print(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
error: invalid conversion from 'int' to 'const char*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
这意味着它试图在不考虑继承过载的情况下调用B的Print.但是,A的打印应该可以由B实例调用.事实上,如果我将呼叫改为
bInstance.A::Print(1);
Run Code Online (Sandbox Code Playgroud)
然后它编译没有任何错误,但我想避免每次都要编写类范围操作符.有没有办法告诉编译器我试图调用基类的函数重载?
我有功能重载的问题.我将向您展示一些简单的例子:
class A {};
class B : public A{};
void somefunction(A&, A&);
void somefunction(B&, B&);
void someotherfunction() {
...
A& a1 = ...
A& a2 = ...
...
}
Run Code Online (Sandbox Code Playgroud)
a1和a2都是B的实例
somefunction(a1,a2);
Run Code Online (Sandbox Code Playgroud)
电话
void somefunction(A&, A&);
Run Code Online (Sandbox Code Playgroud)
我做错了什么?我的意思是多态性和重载是这样的东西,不是吗?
编辑:好的,现在我知道它不起作用(感谢您的答案).
任何解决方案如何做到这一点?没有铸造.
edit2:好吧保持原样,使用类型转换,因为我想要的东西是不可能的.感谢你的帮助.
c++ ×5
overloading ×4
inheritance ×3
class ×1
methods ×1
oop ×1
overriding ×1
polymorphism ×1
using ×1