我有一些代码,我真的想从构造函数调用一个虚方法.我知道这被认为是不安全的,我对对象构造了解得足以理解为什么.我也没有遇到这些问题.目前我的代码正在运行,我认为应该没问题,但我想确定一下.
这是我在做的事情:
我有一些类层次结构,并且有一个普通的公共函数,它像往常一样转发到私有虚方法.但是我确实希望在构造我的对象时调用这个公共方法,因为它将所有数据填充到对象中.我绝对肯定这个虚拟调用来自叶类,因为从类层次结构的任何其他部分使用这个虚方法根本就没有意义.
因此,在我看来,一旦我进行虚拟调用就应该完成对象创建,一切都应该没问题.还有什么可能出错吗?我想我必须用一些重要的注释来标记逻辑的这一部分,以解释为什么这个逻辑永远不会被移动到任何基本条目,即使看起来它可能被移动.但除了其他程序员的愚蠢之外我应该没事,不应该吗?
可能重复:
在构造函数内调用虚函数
看看这段代码.在Base类的构造函数中,我们可以使用'this'指针调用纯虚函数.现在,当我想创建一个指向同一个类的类型指针并将"this"转换为相同类型时.它抛出运行时异常'纯虚函数调用异常'.为什么会这样?
#include <iostream>
using namespace std;
class Base
{
private:
virtual void foo() = 0;
public:
Base()
{
//Uncomment below 2 lines and it doesn't work (run time exception)
//Base * bptr = (Base*)this;
//bptr->foo();
//This call works
this->foo();
}
};
void
Base::foo()
{
cout << "Base::foo()=0" << endl;
}
class Der : public Base
{
public:
Der()
{
}
public:
void foo()
{
cout << "Der::foo()" << endl;
}
};
int main()
{
cout << "Hello World!" …Run Code Online (Sandbox Code Playgroud) 有效的c ++项目9
函数createLogString可以是虚拟的吗?
class BuyTransaction: public Transaction {
?public:
??BuyTransaction( parameters ):Transaction(createLogString(parameters)) { ... }
??...
?private:
??static std::string createLogString( parameters );
};
Run Code Online (Sandbox Code Playgroud) 考虑以下:
我Child从另一个类派生一个类Parent。Parent有大量重载的构造函数。本Child类并不需要任何建造更多的参数。但是一旦调用了基类构造函数,我想在对象构造过程中做更多的事情。
所以我的问题是:使用现代 C++,我可以编写一个构造函数来接受任何重载基类构造函数接受的所有参数并将它们转发给相应的参数吗?
明确地说:我知道using Parent::Parent语法,但据我所知,这不会让我有机会在调用基类构造函数后做任何事情。
我已经在 SO 和互联网的深处搜索过这里,但我找不到任何类似的东西,尽管这对我来说似乎是一个相当普遍的用例。任何帮助将非常感激。
也许我错了,但这似乎是一个非常基本的问题.突然间,我的继承链停止了工作.编写一个小的基本测试应用程序证明我错了(所以我不能责怪编译器).
我有一个基类,在虚函数中具有默认行为.子类派生自那个并改变行为.
#include <iostream>
class Base
{
public:
Base() { print(); }
~Base() {}
protected:
virtual void print() { std::cout << "base\n"; }
};
class Child : public Base
{
public:
Child() {}
~Child() {}
protected:
virtual void print() { std::cout << "child\n"; }
};
int main()
{
Base b;
Child c;
}
Run Code Online (Sandbox Code Playgroud)
这打印:
base
base
Run Code Online (Sandbox Code Playgroud)
创建Child实例时,为什么调用Base :: print()?我认为通过使用virtual关键字,可以替换派生类的函数.
在什么时候我让自己感到困惑?
可能重复:
构造函数中的C++虚函数
调用构造函数内的虚函数
在采访中询问了这个问题.
我想我已经正确回答了第一部分但不确定第二部分.事实上,我对第二部分毫无头绪.
当我尝试在我的编译器上运行相同的问题virtual void foo() = 0;时抛出错误"未定义引用`A :: Foo()'"
#include <iostream>
using namespace std;
class A
{
public:
A()
{
this->Foo();
}
virtual void Foo()
{
cout << "A::Foo()" << endl;
}
};
class B : public A
{
public:
B()
{
this->Foo();
}
virtual void Foo()
{
cout << "B::Foo()" << endl;
}
};
int main(int, char**)
{
B objectB;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我使用具有一些虚方法的父类.当我调用虚拟方法在构造函数中,它提供了LNK2019与LNK1120以"错误error LNK2019: unresolved external symbol "protected: virtual int ... referenced in function "public: __thiscall ..."和" ...\Debug\8puzzleProject.exe : fatal error LNK1120: 1 unresolved externals"的消息.
有没有办法解决这个问题,或者我不是在构造函数中调用虚方法?
谢谢!
这是代码:
有错误的类:
#ifndef HEURISTICSEARCH_H
#define HEURISTICSEARCH_H
#include "BruteSearch.h"
class HeuristicSearch: public BruteSearch
{
public:
HeuristicSearch( int initial[BOARD_LIMIT][BOARD_LIMIT] );
bool search();
protected:
virtual int calculateUtility() = 0;
virtual int calculateUtility( Node* ) = 0;
bool check4Goal();
void checkNmove();
int findMin(int* values );
int utilityCost;
};
#endif
HeuristicSearch::HeuristicSearch( int initial[BOARD_LIMIT][BOARD_LIMIT] …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于c ++构造函数的这篇文章
我们建议您在构造函数中调用虚函数时要小心.因为始终在派生类构造函数之前调用基类构造函数,所以在基础构造函数中调用的函数是基类版本,而不是派生类版本.在下面的示例中,构造DerivedClass导致print_it()的BaseClass实现在DerivedClass构造函数导致执行print_it()的DerivedClass之前执行:
这个例子:
class BaseClass {
public:
BaseClass() {
print_it();
}
virtual void print_it() {
cout << "BaseClass print_it" << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {
print_it();
}
virtual void print_it() {
cout << "Derived Class print_it" << endl;
}
};
int main() {
DerivedClass dc;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
BaseClass print_it
Derived Class print_it
Run Code Online (Sandbox Code Playgroud)
我尝试了这段代码,输出如上所述.但是我也尝试了没有virtual关键字的相同示例:
class BaseClass {
public:
BaseClass() {
print_it();
}
void print_it() {
cout << "BaseClass print_it" << …Run Code Online (Sandbox Code Playgroud) 我今天遇到了相当奇怪的情况.在Interface构造函数中直接调用纯虚方法时,我得到一个未定义的引用错误.
class Interface
{
public:
virtual void fun() const = 0;
Interface(){ fun(); }
};
class A : public Interface
{
public:
void fun() const override {};
};
int main()
{
A a;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
prog.cc: In constructor 'Interface::Interface()':
prog.cc:5:22: warning: pure virtual 'virtual void Interface::fun() const' called from constructor
5 | Interface(){ fun(); }
| ^
/tmp/ccWMVIWG.o: In function `main':
prog.cc:(.text.startup+0x13): undefined reference to `Interface::fun() const'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
但是,使用不同的方法将fun()调用包装为:
class Interface
{
public:
virtual …Run Code Online (Sandbox Code Playgroud) c++ constructor virtual-functions pure-virtual undefined-behavior
c++ ×10
constructor ×4
inheritance ×2
pure-virtual ×2
c++11 ×1
function ×1
lnk2019 ×1
oop ×1
overriding ×1
polymorphism ×1