正如答案所指出的,这是我犯的一个愚蠢的错误,与多态性或智能指针无关。更正后的版本在接受的答案中。
==============原始问题==================
我正在尝试使智能指针与多态一起工作。在下面的原型代码中,纯virtual函数的实现Base::print()应该在Derived对象的内存块中。DerivedWrap可以访问指向Derived对象的指针。
为什么不能DerivedWrap::print()访问函数实现?
using namespace std;
class Base
{
public:
virtual void print() = 0;
};
class Derived : public Base
{
public:
Derived(int in) : i(in) {}
void print() {
cout << "int is " << i << endl;
}
private:
int i;
};
class DerivedWrap
{
public:
DerivedWrap() : DerivedWrap(make_unique<Derived>(2)) {}
DerivedWrap(unique_ptr<Base> pBase) : _pBase(move(pBase)) {}
void print()
{
_pBase->print();
}
private:
unique_ptr<Base> …Run Code Online (Sandbox Code Playgroud) 我正在编写简单的实验代码来测试将一个类的成员函数分配给另一个类的成员函数指针。我的示例代码没有编译。编译器给出了一个错误: “&”:对绑定成员函数表达式进行非法操作。
我看到有些人在将指针传递给成员函数时会执行 (&ClassB::printFun) 。它对我不起作用,因为 printFun 不是静态成员函数。我还看到有人使用 std::bind。但 std 库对我来说不是一个选择,因为我将使用它来编写内核模式代码。我一直在寻找正确的方法来做到这一点,有人可以帮助我吗?谢谢!
using namespace std;
class ClassA
{
public:
ClassA(void(*callBack)(int));
void (*funPtr)(int);
};
ClassA::ClassA(void(*callBack)(int))
{
funPtr = callBack;
}
class ClassB
{
public:
void printFun(int a)
{
cout << a << endl;
}
};
int main()
{
ClassB classB;
ClassA classA(&classB->printFun);
classA.funPtr(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)